import java.util.ArrayList;
import java.util.Scanner;
public class Main {
private static final int MAX=10000000;
private static int n;
private static int M;
private static int[] arr;
private static int[] sum;//sum[i]:代表单词1到单词i的总字符数(sum[i]=l1+l2+...+li)
private static int[] dp;//dp[i]:代表安排单词1~j的最小费用
private static int[] pre;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
M=sc.nextInt();
arr=new int[n+1];
sum=new int[n+1];
dp=new int[n+1];
pre=new int[n+1];
for(int i=1;i<=n;i++){
arr[i]=sc.nextInt();
sum[i]=sum[i-1]+arr[i];
}
for(int i=1;i<=n;i++){
dp[i]=lc(1,i);
pre[i]=0;
for(int j=2;j<=i;j++){
int temp=dp[j-1]+lc(j,i);
if(temp<dp[i]){
dp[i]=temp;
pre[i]=j-1;
}
}
}
System.out.println("最小费用:"+dp[n]);
traceBack();
}
//将单词i~j打印在一行上的费用
private static int lc(int i,int j){
int extra=M-j+i-(sum[j]-sum[i-1]);
if(extra<0){
return MAX;
}else if(j==n){
return 0;
}else{
return extra*extra*extra;
}
}
private static void traceBack(){
int k=n;
ArrayList<String> list=new ArrayList<String>();
while(k!=0){
list.add((pre[k]+1)+"~"+k);
k=pre[k];
}
for(int i=list.size()-1;i>=0;i--){
System.out.print(list.get(i)+" ");
}
}
}
算法_动态规划_漂亮打印
最新推荐文章于 2021-04-24 20:32:03 发布