给定n个整数组成的序列,现在要求将序列分割为m段,每段子序列中的数在原序列中连续排列。如何分割才能使这m段子序列的和的最大值达到最小?
样例输入
1 1
10
样例输出
10
样例输入
9 3
9 8 7 6 5 4 3 2 1
样例输出
17
public static int getMin(int a[], int len) {
int dp[][] = new int[a.length][len+1];
for (int i = 1; i < a.length; i++) {
dp[i][1] = dp[i - 1][1] + a[i-1];
}
for (int i = 1; i < a.length; i++) {
for (int j = 2; j <= len; j++) {
int min = Integer.MAX_VALUE;
for (int k = 1; k < i; k++) {
if (min > Math.max(dp[i][1] - dp[k][1], dp[k][j - 1])) {
min = Math.max(dp[i][1] - dp[k][1], dp[k][j - 1]);
}
}
dp[i][j] = min;
}
}
for(int i=0;i<a.length;i++) {
for(int j=0;j<len+1;j++) {
System.out.print(dp[i][j]+" ");
}
System.out.println();
}
return dp[a.length-1][len];
}
思路如下面矩阵:
0 0 0 0
0 9 2147483647 2147483647
0 17 9 2147483647
0 24 15 9
0 30 17 13
0 35 18 15
0 39 22 15
0 42 24 17
0 44 24 17
横向代表分几段0,1,2,3,4
纵向代表有几个数字。
其实这个问题和01背包很像。