最小m段和问题
![在这里插入图片描述](https://img-blog.csdnimg.cn/5043097a5bb847f4a5f7c461ce6f276e.png#pic_center)
package Test;
import java.util.Scanner;
public class ZuiXiaoMduanhe {
public static void MinSum(int arr[],int dp[][],int n,int m,int s[][]){
for(int i=1;i<=n;i++){
dp[i][1] = dp[i-1][1]+arr[i-1];
}
for(int i=1;i<=n;i++){
for(int j=2;j<=m;j++){
int min = 2147483647;
for(int k=1;k<=i;k++){
int num = Math.max(dp[k][j-1],dp[i][1]-dp[k][1]);
if(num<min){
min = num;
s[i][j] = k;
}
}
dp[i][j] = min;
}
}
System.out.println("最小的为: "+dp[n][m]);
System.out.println("分段情况: ");
while(m!=1){
int k = s[n][m];
System.out.print(k+" ");
n = k;
m--;
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("请输入数组长度: ");
int n = scan.nextInt();
System.out.print("请输入分的段数: ");
int m = scan.nextInt();
int arr[] = new int[n];
System.out.println("请依次输入数组元素: ");
for(int i=0;i<n;i++){
arr[i] = scan.nextInt();
}
int dp[][] = new int[n+1][m+1];
int s[][] = new int[n+1][m+1];
MinSum(arr,dp,n,m,s);
}
}