2218-从栈中取出 K 个硬币的最大面值和

Raphael Liu Lv10

一张桌子上总共有 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];
}
};
 Comments
On this page
2218-从栈中取出 K 个硬币的最大面值和