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