```java
import java.util.List;

class Solution {
    public int maxValueOfCoins(List<List<Integer>> piles, int k) {
        // dp[t] 表示取出恰好 t 个硬币的最大总价值
        int[] dp = new int[k + 1];
        // 遍历每一个栈
        for (List<Integer> pile : piles) {
            int size = pile.size();
            // 计算前缀和,pref[i] 表示取出该栈前 i 个硬币的总价值
            int[] pref = new int[size + 1];
            for (int i = 1; i <= size; i++) {
                pref[i] = pref[i - 1] + pile.get(i - 1);
            }
            // 倒序更新 dp 数组,确保每个栈最多被使用一次
            for (int t = k; t >= 0; t--) {
                // 尝试从当前栈中取出 j 个硬币
                int maxJ = Math.min(size, t); // 不能超过栈大小和当前剩余总数
                for (int j = 1; j <= maxJ; j++) {
                    dp[t] = Math.max(dp[t], dp[t - j] + pref[j]);
                }
            }
        }
        return dp[k];
    }
}
```

 

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐