返回
C/C++2234 花园的最大总美丽值
后端
2023-12-13 03:06:53
在本文中,我们将探讨如何解决 LeetCode 2234. 花园的最大总美丽值 问题。该问题旨在找到一种方法,通过在花园中种植花朵来最大化所有花园的总美丽值。
问题
Alice 是 n 个花园的园丁,她想通过种花,最大化她所有花园的总美丽值。
给你一个下标从 0 开始的整数数组 flowers,其中 flowers[i] 是第 i 个花园当前种植的花朵数。
Alice 有两种操作可用于每个花园:
- 操作 1 :移除所有花朵(即,flowers[i] = 0)。
- 操作 2 :增加一朵花(即,flowers[i]++)。
花园的美丽值等于其当前种植的花朵数。
返回 Alice 能得到的 最大总美丽值。
示例
示例 1:
输入:flowers = [1,2,3,4]
输出:11
解释:
- 在花园 0 中移除 1 朵花,flowers = [0,2,3,4],美丽值 = 0 + 2 + 3 + 4 = 9。
- 在花园 3 中移除 1 朵花,flowers = [0,2,3,3],美丽值 = 0 + 2 + 3 + 3 = 8。
- 最终,最大总美丽值为 9 + 8 = 17。
由于 17 > 11,所以返回 11。
示例 2:
输入:flowers = [1,2,3]
输出:9
解释:
- 最佳方法是不要进行任何操作,因为花园的美丽值已经达到最大。
思路
这个问题可以通过动态规划来解决。我们定义 dp[i][j] 为以第 i 个花园为结尾,且该花园中种植了 j 朵花的最大总美丽值。
对于每个花园,我们有两种选择:
- 移除所有花朵 :dp[i][0] = dp[i-1][flowers[i]]
- 增加一朵花 :dp[i][j] = dp[i-1][j-1] + j
通过遍历所有花园和美丽值,我们可以得到最大总美丽值。
代码实现
class Solution {
public:
int maximumBeauty(vector<int>& flowers) {
int n = flowers.size();
int dp[n][101];
memset(dp, 0, sizeof(dp));
for (int i = 0; i < n; i++) {
for (int j = 0; j <= flowers[i]; j++) {
// 移除所有花朵
dp[i][j] = max(dp[i][j], dp[i-1][flowers[i]]);
// 增加一朵花
if (i > 0) dp[i][j] = max(dp[i][j], dp[i-1][j-1] + j);
}
}
return dp[n-1][0];
}
};
时间复杂度
O(n * flowers[i]),其中 n 是花园的数量。
空间复杂度
O(n * flowers[i])