IOI flower

 

<问题分析>

状态转移函数 s[i][j]=max{s[i-1][k]}+a[i][j]   i<=k<j

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 
 5 //  s[i][j]=max{s[i-1][t]+a[i][j]}
 6 int main()
 7 {
 8     int i,j,k,f,v,tag,a[101][101],s[101][101],w[101][101],t[101];
 9     scanf("%d %d",&f,&v);
10     for(i=1;i<=f;i++)
11     {
12        for(j=1;j<=v;j++)
13        {
14            scanf("%d",&a[i][j]);
15        }
16     }
17     for(i=1;i<=v;i++)
18     {
19        s[1][i]=a[1][i];
20     }
21     for(i=2;i<=f;i++)
22     {
23        for(j=i;j<=v;j++)
24        {
25           tag=-510000;
26           for(k=i;k<j;k++)
27           {
28              if(tag<s[i-1][k])
29              {
30                 tag=s[i-1][k];
31                 w[i][j]=k;
32              }              
33           }
34           s[i][j]=tag+a[i][j];
35        }
36     }
37     j=f;k=s[f][f];t[f]=f;
38     for(i=f+1;i<=v;i++)
39     {
40        if(k<s[f][i])
41        {
42           k=s[f][i];t[f]=i;
43        }
44     }
45     while(j>1)
46     {
47        j--;
48        t[j]=w[j+1][t[j+1]];
49     }
50     printf("%d\n",k);
51     for(i=1;i<f;i++)
52       printf("%d ",t[i]);
53     printf("%d\n",t[f]);
54     while(true);
55     return 0;
56 }

 

posted @ 2013-07-05 21:32  simplesslife  阅读(209)  评论(0编辑  收藏  举报