一张桌子上总共有 n
个硬币 栈 。每个栈有 正整数 个带面值的硬币。
每一次操作中,你可以从任意一个栈的 顶部 取出 1 个硬币,从栈中移除它,并放入你的钱包里。
给你一个列表 piles
,其中 piles[i]
是一个整数数组,分别表示第 i
个栈里 从顶到底 的硬币面值。同时给你一个正整数
k
,请你返回在 恰好 进行 k
次操作的前提下,你钱包里硬币面值之和 最大为多少 。
示例 1:
**输入:** piles = [[1,100,3],[7,8,9]], k = 2
**输出:** 101
**解释:**
上图展示了几种选择 k 个硬币的不同方法。
我们可以得到的最大面值为 101 。
示例 2:
**输入:** piles = [[100],[100],[100],[100],[100],[100],[1,1,1,1,1,1,700]], k = 7
**输出:** 706
**解释:** 如果我们所有硬币都从最后一个栈中取,可以得到最大面值和。
提示:
n == piles.length
1 <= n <= 1000
1 <= piles[i][j] <= 105
1 <= k <= sum(piles[i].length) <= 2000
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| class Solution { public: int maxValueOfCoins(vector<vector<int>>& piles, int k) { int dp[piles.size()][k+1]; for(int i=0;i<piles.size();i++){ for(int j=0;j<k+1;j++){ dp[i][j]=INT_MIN; } } for(int i=0;i<piles.size();i++){ dp[i][0]=0; } for(int i=1;i<=k;i++){ if(i>piles[0].size()){ } else{ dp[0][i]=dp[0][i-1]+piles[0][i-1]; } } int temp; int count=piles[0].size(); for(int i=1;i<piles.size();i++){ count+=piles[i].size(); for(int j=1;j<=count&&j<=k;j++){ if(j<=count-piles[i].size()){ dp[i][j]=dp[i-1][j]; } else{ dp[i][j]=INT_MIN; } temp=0; for(int m=1;m<=piles[i].size()&&m<=j;m++){ temp+=piles[i][m-1]; dp[i][j]=max(dp[i][j],dp[i-1][j-m]+temp); } } } return dp[piles.size()-1][k]; } };
|