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; }