BZOJ 1587: 叶子合并leaves

题目大意:
求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\n",f[n][k]);
	return 0;
}

 

  

 

posted @ 2018-04-09 11:04  ~Silent  阅读(166)  评论(1编辑  收藏  举报
Live2D