文章目录
- 一、题目
- 二、题解
一、题目
There are n piles of coins on a table. Each pile consists of a positive number of coins of assorted denominations.
In one move, you can choose any coin on top of any pile, remove it, and add it to your wallet.
Given a list piles, where piles[i] is a list of integers denoting the composition of the ith pile from top to bottom, and a positive integer k, return the maximum total value of coins you can have in your wallet if you choose exactly k coins optimally.
Example 1:
Input: piles = [[1,100,3],[7,8,9]], k = 2
Output: 101
Explanation:
The above diagram shows the different ways we can choose k coins.
The maximum total we can obtain is 101.
Example 2:
Input: piles = [[100],[100],[100],[100],[100],[100],[1,1,1,1,1,1,700]], k = 7
Output: 706
Explanation:
The maximum total can be obtained if we choose all coins from the last pile.
Constraints:
n == piles.length
1 <= n <= 1000
1 <= piles[i][j] <= 105
1 <= k <= sum(piles[i].length) <= 2000
二、题解
class Solution {
public:int maxValueOfCoins(vector<vector<int>>& piles, int m) {int n = piles.size();vector<vector<int>> dp(n+1,vector<int>(m+1,0));for(int i = 1;i <= n;i++){vector<int> team = piles[i-1];int t = min((int)team.size(),m);vector<int> preSum(t+1,0);for(int j = 0,sum = 0;j < t;j++){sum += team[j];preSum[j + 1] = sum;}for(int j = 0;j <= m;j++){dp[i][j] = dp[i-1][j];for(int k = 1;k <= min(t,j);k++){dp[i][j] = max(dp[i][j],dp[i-1][j-k] + preSum[k]);}}}return dp[n][m];}
};