1043. 分隔数组以得到最大和【leetcode】/动态规划

1043. 分隔数组以得到最大和

给你一个整数数组 arr,请你将该数组分隔为长度 最多 为 k 的一些(连续)子数组。分隔完成后,每个子数组的中的所有值都会变为该子数组中的最大值。

返回将数组分隔变换后能够得到的元素最大和。本题所用到的测试用例会确保答案是一个 32 位整数。

示例 1:
输入:arr = [1,15,7,9,2,5,10], k = 3
输出:84
解释:数组变为 [15,15,15,9,10,10,10]

示例 2:
输入:arr = [1,4,1,5,7,3,6,1,9,9,3], k = 4
输出:83

示例 3:
输入:arr = [1], k = 1
输出:1

提示:
1 <= arr.length <= 500
0 <= arr[i] <= 109
1 <= k <= arr.length

动态规划

dp[i]表示到第i个数得到的最大和,每次先令第i个元素单独为一组,再令它和前面一个为一组…直到它和前面k-1个为一组,取最大的

class Solution {
public:
    int maxSumAfterPartitioning(vector<int>& arr, int k) 
    {
        if(k==0) return 0;
        int dp[505];
        memset(dp,0,sizeof(dp));
        int len=arr.size();
        dp[0]=arr[0];
        for(int i=1;i<len;i++)
        {
            //表示选择的数中的最大值
            int maxn=arr[i];
            for(int j=i;j>=i-k+1&&j>=0;j--)
            {
                maxn=max(maxn,arr[j]);
                (j==0)?dp[i]=max(dp[i],maxn*(i-j+1)):dp[i]=max(dp[i],dp[j-1]+maxn*(i-j+1));
            }
        }
        return dp[len-1];
    }
};

你可能感兴趣的:(leetcode,动态规划,算法)