【noi 2.6_162】Post Office(DP)
这题和“山区建小学”除了输入不同,其他都一样。(解析可见我的上一篇随笔)
但是,这次我对dis[][]加了一个优化,画一下图就可明白。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 5 const int N=310,M=35; 6 int s[N],f[N][M],dis[N][N]; 7 8 int mmin(int x,int y) {return x<y?x:y;} 9 int main() 10 { 11 int n,m; 12 scanf("%d%d",&n,&m); 13 for (int i=1;i<=n;i++) 14 scanf("%d",&s[i]); 15 dis[1][0]=0; 16 for (int l=1;l<=n;l++) 17 for (int r=l;r<=n;r++) 18 dis[l][r]=dis[l][r-1]+s[r]-s[(l+r)>>1]; 19 memset(f,63,sizeof(f)); 20 f[0][0]=0; 21 for (int i=1;i<=n;i++) 22 for (int j=1;j<=m;j++) 23 { 24 if (j>i) {f[i][j]=0;continue;} 25 for (int k=j-1;k<i;k++) 26 f[i][j]=mmin(f[i][j],f[k][j-1]+dis[k+1][i]); 27 } 28 printf("%d\n",f[n][m]); 29 return 0; 30 }