LeetCode每日一题(2218. Maximum Value of K Coins From Piles)

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:

LeetCode每日一题(2218. Maximum Value of K Coins From Piles)_第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 Solution {
    fn dp(piles: &Vec<Vec<i32>>, mut k: i32, i: usize, cache: &mut HashMap<(usize, i32), i32>) -> i32 {
        if k == 0 || i == piles.len() {
            return 0;
        }
        if let Some(&c) = cache.get(&(i, k)) {
            return c;
        }
        let mut ans = 0;
        let mut curr = 0;
        ans = ans.max(Solution::dp(piles, k, i + 1, cache));
        let mut curr_k = k;
        for &v in &piles[i] {
            curr += v;
            curr_k -= 1;
            if curr_k < 0 {
                break;
            }
            let next = Solution::dp(piles, curr_k, i + 1, cache);
            ans = ans.max(curr + next);
        }
        cache.insert((i, k), ans);
        ans
    }
    pub fn max_value_of_coins(piles: Vec<Vec<i32>>, k: i32) -> i32 {
        Solution::dp(&piles, k, 0, &mut HashMap::new())
    }
}

你可能感兴趣的:(leetcode,算法)