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
假设 dp[i][k]是当我们取到 piles[i]时还剩下 k 次机会所能拿到的最大值, dp[i][k] = max(
sum(piles[i][…1]) + dp[i+1][k-1],
sum(piles[i][…2]) + dp[i+1][k-2],
sum(piles[i][…3]) + dp[i+1][k-3],
…
sum(piles[i][…n]) + dp[i+1][k-n])
这里要注意一点是当前 pile 我们可以不取硬币直接跳过
use std::collections::HashMap;
impl