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

 

posted @ 2016-09-22 16:17  konjac蒟蒻  阅读(277)  评论(0编辑  收藏  举报