动态规划:
1. 首先确定dp数组前k项的值
2. 从第k+1项开始,若想在第i项取得最大值,那么需要求得dp[i-k]+子数组i-k+1到第i项的值与,dp[i-k+1]子数组到i-k+2到第i项的值......与dp[i-1]+第i项中的最大值
3. dp递推公式为: dp[i]=max(dp[i-1]+max(arr[i])*1, dp[i-2]+max(arr[i], arr[i-1])*2, ... , dp[i-k]+max(arr[i], arr[i-k+1])*k);
class Solution {
public:
/*动态规划:前k项
1.若想在第i项取得最大值,那么需要求得第i-k到i-1+第i项的最大值
2.dp公式为 dp[i] = max(dp[i-1]+max(dp[i])*1,dp[i-2]+max(dp[i-1],dp[i])*2....dp[i-k])*/
int maxSumAfterPartitioning(vector<int>& arr, int k) {
vector<int> dp(arr.size(),0);
int c_max; // i-k 到 i子数组的值
int start = 0;
int end = 0;
for(int i=0;i<arr.size();i++){
// 清空记录的k个数组
if(i<k){
// 前k个dp数组的最大值
auto it = max_element(arr.begin(),arr.begin()+i+1);
// cout<<*it<<endl;
dp[i] = (*it)*(i+1);
}else{
int n = k;
while(n){
auto it = max_element(arr.begin()+i-n+1,arr.begin()+i+1);
c_max = (*it)*n;
// cout<<*it<<" "<<n<<" "<<dp[i]<<" "<<dp[i-n+1]<<" "<<c_max<<endl;
dp[i] = max(dp[i],c_max+dp[i-n]);
n--;
}
}
}
return *(max_element(dp.end()-k,dp.end()));
}
};