返回

C/C++2234 花园的最大总美丽值

后端

在本文中,我们将探讨如何解决 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 朵花的最大总美丽值。

对于每个花园,我们有两种选择:

  1. 移除所有花朵 :dp[i][0] = dp[i-1][flowers[i]]
  2. 增加一朵花 :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])