Leetcode(1043)分隔数组以得到最大和
*初始数组 arr = [1,15,7,9,2,5,100] k=3
dp[i] 表示前i个元素分割为长度小于k的连续子数组,分隔变换后能够得到的元素最大和。
那么我们从0开始推导
dp[0]=1
dp[1]=30
dp[2]=45
很容易看出,元素个数小于k的时候,直接找数组最大值,乘上元素个数即可。
那么我们接着看第k个元素。
dp[3]=?
由于题目要求的是,子数组元素个数不大于k。那么跟arr[3]在一个分组的情况一共有k种
(arr[3])
(arr[3],arr[2])
(arr[3],arr[2],arr[1])
那么,我们计算dp[3]只需要计算出比较这k种组合的最大值即可。
那么我们可以得到归纳方程
dp[n]=max(dp[n-1]+max(arr[n])*1, dp[n-2]+max(arr[n], arr[n-1])*2, … , dp[n-k]+max(arr[n], arr[n-k+1])*k);
这里我们可以用个循环实现
for i in range(1,k):
dp[n] = max(dp[n], dp[n-i]+max(arr[n], arr[n-i+1])*i);
需要注意的几个问题
1.就是从(1,k)的for循环,因为dp的精髓就是我们只需要关注当下dp[i]或者说是arr[i]和之前的数据dp[i-某],不需要考虑后面的dp[i+某],所以对于(1,k)最为简单就是[0,i]种最大的一个元素*个数;
2.从[k,n)我们需要关注的就是要进行比较也就是同国for(int j=1;j<=k;j++)这个循环来控制;
3.还有一个重要的就是边界条件是i-j还是i-j+1,是<k还是<k+1这都需要考虑的,边界值对于这种题目影响很大。
class Solution {
#