NC327. 取数游戏
描述
示例1
输入:
[1,1000],[2,1]
输出:
2001
示例2
输入:
[1,3,5,2,4],[1,2,3,4,5]
输出:
52
说明:
第一次从左边取走a1,v1=a1⋅b1=1,C++ 解法, 执行用时: 5ms, 内存消耗: 412KB, 提交时间: 2022-06-23
class Solution { public: int numbergame(vector<int>& A, vector<int>& B) { int i, j, h = A.size(), z = 0; if (h && (h == B.size())) { vector<int> a(h); for (i = 0; i < h; i++) a[i] = A[i] * B[h - 1]; for (i = h - 1; i >= 0; i--) for (j = i + 1; j < h; j++) a[j] = ((A[i] * B[h + i - j - 1] + a[j]) >= (A[j] * B[h + i - j - 1] + a[j - 1])) ? (A[i] * B[h + i - j - 1] + a[j]) : (A[j] * B[h + i - j - 1] + a[j - 1]); z = a[h - 1]; } return z; } };
C++ 解法, 执行用时: 5ms, 内存消耗: 416KB, 提交时间: 2022-05-22
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param A int整型vector * @param B int整型vector * @return int整型 */ int numbergame(vector<int>& A, vector<int>& B) { int i,j,sz=A.size(),res=0; if(sz&&(sz==B.size())) { vector<int> dp(sz); for(i=0;i<sz;i++) dp[i]=A[i]*B[sz-1]; for(i=sz-1;i>=0;i--) for(j=i+1;j<sz;j++) dp[j]=((A[i]*B[sz+i-j-1]+dp[j])>=(A[j]*B[sz+i-j-1]+dp[j-1]))? (A[i]*B[sz+i-j-1]+dp[j]):(A[j]*B[sz+i-j-1]+dp[j-1]); res=dp[sz-1]; } return res; } };
C++ 解法, 执行用时: 5ms, 内存消耗: 420KB, 提交时间: 2022-05-11
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param A int整型vector * @param B int整型vector * @return int整型 */ int numbergame(vector<int>& A, vector<int>& B) { // write code here int len=A.size(); vector<int> dp(A.size(),0); for(int i=0;i<len;i++) dp[i]=A[i]*B[len-1]; for(int i=len-1;i>=0;i--) { for(int j=i+1;j<len;j++) { dp[j]=max(A[i]*B[len-1-(j-i)]+dp[j],A[j]*B[len-1-(j-i)]+dp[j-1]); } } return dp[len-1]; } };
C++ 解法, 执行用时: 8ms, 内存消耗: 4352KB, 提交时间: 2022-07-08
class Solution {//写出动态转换方程 public://dp[i][j]=max(dp[i+1][j]+A[i]*B[n-(j-i+1)],dp[i][j-1]+A[j]*B[n-(j-i+1)])i<=j int numbergame(vector<int>& A, vector<int>& B) { vector<vector<int>>dp(A.size(),vector<int>(A.size(),0)); for(int i=A.size()-1;i>=0;i--){ dp[i][i]=A[i]*B[A.size()-1]; } for(int i=A.size()-2;i>=0;i--){ for(int j=i+1;j<A.size();j++){ dp[i][j]=max(dp[i+1][j]+A[i]*B[A.size()-(j-i+1)],dp[i][j-1]+A[j]*B[A.size()-(j-i+1)]); } } return dp[0][A.size()-1]; } };
C++ 解法, 执行用时: 8ms, 内存消耗: 4356KB, 提交时间: 2022-05-05
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param A int整型vector * @param B int整型vector * @return int整型 */ int numbergame(vector<int>& A, vector<int>& B) { // write code here int n = A.size(); vector<vector<int> > dp(n, vector<int>(n)); for (int i = n - 1; i >= 0; i--) { for (int j = i; j < n; j++) { if (i == j) { dp[i][j] = A[i] * B[n - 1]; } else { dp[i][j] = max(dp[i + 1][j] + A[i] * B[n - (j - i + 1)], dp[i][j - 1] + A[j] * B[n - (j - i + 1)]); } } } return dp[0][n - 1]; } };