1.动态规划:
1.首先搞到前缀和数组,通过它来得到各连续子数组的和
2.i j 表示分成i 组,最大下标在j 处的值。
3.差点忘记状态转移方程
状态转移方程:
每一个dp[i][j]
从下标j 开始向 下标i-1 遍历,
dp[i][j]=min(dp[i][j],max(dp[i-1][k],sum[j-1]-sum[k-1])); 从而得到值。
class Solution {
public:
int splitArray(vector<int>& nums, int m) {
int n=nums.size();
vector<vector<long long>> dp(m+1,vector<long long>(n+1,INT_MAX));
vector<long long> sum(n);
sum[0]=nums[0];
for(int i=1;i<n;i++) {
sum[i]=nums[i]+sum[i-1];
}
dp[0][0]=0;
for(int i=1;i<=m;i++){
for(int j=i;j<=n;j++){
if(i==1) dp[i][j]=sum[j-1];
else{
for(int k=i-1;k<j;k++)
dp[i][j]=min(dp[i][j],max(dp[i-1][k],sum[j-1]-sum[k-1]));
}
}
}
return dp[m][n];
}
};