列表

详情


NC393. 取金币

描述

给定一个长度为 n 的正整数数组 coins,每个元素表示对应位置的金币数量。
取位置 的金币时,假设左边一堆金币数量是L,右边一堆金币数量为R,则获得L*cost[i]*R的积分。如果左边或右边没有金币,则金币数量视为1。
请你计算最多能得到多少积分。

数据范围:数组长度满足 ,数组中的元素满足

示例1

输入:

[5,6,4,8]

输出:

480

说明:

第一步取 4,得 6*4*8 = 192,余下 5 6 8。
第二步取 6,得 5*6*8 = 240,余下 5 8。
第三步取 5,得 5*8*1 = 40,余下 8。
最后取 8,得 1*8*1 = 8 。
最终积分为 192+240+40+8 = 480。

原站题解

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

C 解法, 执行用时: 4ms, 内存消耗: 404KB, 提交时间: 2022-06-24

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param coins int整型一维数组 
 * @param coinsLen int coins数组长度
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */

int max(int a, int b) {
    return a > b ? a : b;
}

int getCoins(int* coins, int coinsLen ) {
    int coinExt[coinsLen + 2];
    for (int i = 0; i < coinsLen + 2; i++) {
        if (i == 0 || (i == coinsLen +1)) {
            coinExt[i] = 1;
        } else {
            coinExt[i] = coins[i-1];
        }
    }
    int dp[coinsLen][coinsLen];
    for (int i = 0; i < coinsLen; i++) {
        memset(dp[i], 0, sizeof(dp[i]));
        dp[i][i] = coinExt[i]*coinExt[i+1]*coinExt[i+2];
    }
    
    for (int l = coinsLen - 1; l>=0; l--) {
        for (int r = l + 1; r < coinsLen; r++) {
            dp[l][r] = dp[l][r-1] + coinExt[l] * coinExt[r+1] * coinExt[r+2];
            
            dp[l][r] = max(dp[l][r], dp[l+1][r] + coinExt[l] * coinExt[l+1] * coinExt[r+2]);
            
            for (int i = l; i < r-1; i++) {
                dp[l][r] = max(dp[l][r], dp[l][i] + dp[i+2][r] + coinExt[l] * coinExt[i+2] * coinExt[r+2]);
            }
        }
    }
    
    return dp[0][coinsLen - 1];
}



C++ 解法, 执行用时: 4ms, 内存消耗: 420KB, 提交时间: 2022-07-19

class Solution {
  public:
    int getCoins(vector<int>& coins) {
        int h = coins.size();
        vector<vector<int>> v(h + 2, vector<int>(h+ 2, 0));
        vector<int> e(h + 2, 1);       
        for (int i = 1; i < h + 1; i ++) {
            e[i] = coins[i - 1];
        }
        
        for (int j = 2; j <= h + 1; j ++) {
            for (int i = j - 2; i >= 0; i --) {
                for (int k = i + 1; k < j; k ++) {
                    int L = e[i], R = e[j];
                    v[i][j] = max(v[i][j], L * R * e[k] + v[i][k] + v[k][j]);
                }
            }
        }
        return v[0][h + 1];
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 424KB, 提交时间: 2022-07-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param coins int整型vector 
     * @return int整型
     */
    int getCoins(vector<int>& coins) {
        // write code here
        int n = coins.size();
        vector<vector<int>> dp(n + 2, vector<int>(n + 2, 0));
        vector<int> temp(n + 2, 1);
        for(int i = 1; i < n + 1; i ++){
            temp[i] = coins[i - 1];
        }
        for(int j = 2; j <= n + 1; j ++){
            for(int i = j - 2; i >= 0; i --){
                for(int k = i + 1; k < j; k ++){
                    int left = temp[i], right = temp[j];
                    dp[i][j] = max(dp[i][j], left * right * temp[k] + dp[i][k]+ dp[k][j]);
                }
            }
        }
        return dp[0][n + 1];
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 428KB, 提交时间: 2022-08-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param coins int整型vector 
     * @return int整型
     */
    int getCoins(vector<int>& coins) {
        // write code here
        int h=coins.size();
        vector<vector<int>> v(h+2,vector<int>(h+2,0));
        vector<int> e(h+2,1);
        for(int i=1;i<h+1;i++)
        {
            e[i]=coins[i-1];
        }
        for(int j=2;j<=h+1;j++)
        {
            for(int i=j-2;i>=0;i--)
            {
                for(int k=i+1;k<j;k++)
                {
                    int L=e[i],R=e[j];
                    v[i][j]=max(v[i][j],L*R*e[k]+v[i][k]+v[k][j]);
                }
            }
        }
        return v[0][h+1];
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 432KB, 提交时间: 2022-05-12

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param coins int整型vector 
     * @return int整型
     */

    int getCoins(vector<int>& coins) {
        // write code here
        int len=coins.size();
        if(len==0)    return 0;
        vector<int> helper(len+2,1);
        for(int i=1;i<=len;i++)
        {
            helper[i]=coins[i-1];
        }
        vector<vector<int>>  dp(len+2,vector<int>(len+2));
        for(int i=1;i<=len;i++)
        {
            dp[i][i]=helper[i]*helper[i-1]*helper[i+1];
        }
        for(int l=len;l>=1;l--)
        {
            for(int r=l+1;r<=len;r++)
            {
                int fl=dp[l+1][r]+helper[l]*helper[l-1]*helper[r+1];
                int fr=dp[l][r-1]+helper[r]*helper[l-1]*helper[r+1];
                dp[l][r]=max(fl,fr);
                for(int i=l+1;i<r;i++)
                    dp[l][r]=max(dp[l][r],dp[l][i-1]+dp[i+1][r]+helper[i]*helper[l-1]*helper[r+1]);
            }
        }
        return dp[1][len];
    }
};

上一题