列表

详情


NC327. 取数游戏

描述

给定两个长度为 n 的整数列 A 和 B ,每次你可以从 A 数列的左端或右端取走一个数。假设第 i 次取走的数为 ,则第i次取走的数的价值 ,现在希望你求出 的最大值。

数据范围: ,

示例1

输入:

[1,1000],[2,1]

输出:

2001

示例2

输入:

[1,3,5,2,4],[1,2,3,4,5]

输出:

52

说明:

第一次从左边取走a1,v1=a1⋅b1=1,
第二次从左边取走a2,v2=a2⋅b2=6,
第三次从右边取走a5,v3=a5⋅b3=12,
第四次从右边取走a4,v4=a4⋅b4=8,
第五次取走剩下的a3,v5=a3⋅b5=25。
总价值∑vi=1+6+12+8+25=52

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

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];
    }
};

上一题