[JZOJ P1265] [DP]花店橱窗

@kaike

传送门

这是某年ioi的题?别看我我不知道

光看题目都看不懂

话说要什么花束编号必须按顺序啊

求最大值啊

还要什么输出编号啊

听说DP出方案都是耍流氓

f[i][j]=max(f[i-1][k])+a[i][j]

 1     for(int i=1;i<=n;i++)//枚举花束
 2         for(int j=i;j<=v-n+i;j++)//枚举花瓶,范围要注意
 3         {
 4             mm=-99999999;
 5             for(int k=i-1;k<j;k++)//枚举第i-1花束的位置
 6                 if(f[i-1][k]>mm)
 7                 {
 8                     mm=f[i-1][k];
 9                     c=k;
10                 }
11             f[i][j]=mm+a[i][j];//逐个往后推
12             pre[i][j]=c;//记录每个最合适的位置
13         }

 

 1 #include<iostream>
 2 using namespace std;
 3 int n,v,c,a[110][110],f[110][110];
 4 int maxx=0,mm=0,ans[110],pre[110][110];
 5 int main()
 6 {
 7     cin>>n>>v;
 8     int tt=n;
 9     for(int i=1;i<=n;i++)
10         for(int j=1;j<=v;j++)
11             cin>>a[i][j];
12     for(int i=1;i<=n;i++)//枚举花束
13         for(int j=i;j<=v-n+i;j++)//枚举花瓶,范围要注意
14         {
15             mm=-99999999;
16             for(int k=i-1;k<j;k++)//枚举第i-1花束的位置
17                 if(f[i-1][k]>mm)
18                 {
19                     mm=f[i-1][k];
20                     c=k;
21                 }
22             f[i][j]=mm+a[i][j];//逐个往后推
23             pre[i][j]=c;//记录每个最合适的位置
24         }
25     for(int i=1;i<=v;i++)
26         if(maxx<f[n][i])
27         {
28             maxx=f[n][i];
29             ans[tt]=i;//求最后一个花束的位置
30         }
31     for(int i=n;i>1;i--)
32     {
33         int temp=pre[i][ans[tt]];
34         ans[--tt]=temp;//依次往前递推,求位置
35     }
36     cout<<maxx<<endl;
37     for(int i=1;i<=n;i++)
38         cout<<ans[i]<<' ';
39     return 0;
40 }
你撒不撒

 

posted @ 2016-10-09 13:48  kaike  阅读(149)  评论(0编辑  收藏  举报