题目大意:
求n个数分成k段的最小代价。
题解:
DP,没什么好说的。
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
int a[1000005],ssum[1000005],sum[1000005],f[1005][1005];
int calc(int l,int r){
return ssum[r]-ssum[l-1]-(sum[r]-sum[l-1])*l;
}
int main(){
int n,k;
scanf("%d%d",&n,&k);
for (int i=1; i<=n; i++){
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
ssum[i]=ssum[i-1]+a[i]*i;
}
for (int i=1; i<=n; i++)
for (int j=0; j<=k; j++)
f[i][j]=1e9;
for (int i=1; i<=n; i++)
for (int j=1; j<=k; j++)
for (int p=0; p<i; p++)
f[i][j]=min(f[i][j],f[p][j-1]+calc(p+1,i));
printf("%d
",f[n][k]);
return 0;
}