题目:http://www.joyoi.cn/problem/tyvj-1124
此题首先注意一束花能往哪些花瓶中放置:原本应放在本位置,但因为有多余花瓶,故可以有些变动,范围在i~i+v-f间;
假设选择此花瓶,则对其上一束花的摆放位置有要求:放在此花瓶之前;故再用k循环一遍;
输出路径在上一步中记录,只需以角标记录此花这种摆放方式对应的上一束花的摆放位置,递归输出即可。
代码如下:
#include<iostream> #include<cstdio> using namespace std; int f,v,w[105][105],path[105][105],dp[105][105],ans,p; void print(int i,int j) { if(!i)return; print(i-1,path[i][j]); printf("%d ",j); } int main() { scanf("%d%d",&f,&v); for(int i=1;i<=f;i++) for(int j=1;j<=v;j++) scanf("%d",&w[i][j]); for(int i=1;i<=f;i++) { int up=i+v-f; for(int j=i;j<=up;j++) { dp[i][j]=dp[i-1][i-1]+w[i][j];//! path[i][j]=i-1;//! for(int k=i;k<j;k++)//不能k=i-1! { if(dp[i][j]<dp[i-1][k]+w[i][j]) { dp[i][j]=dp[i-1][k]+w[i][j]; path[i][j]=k; } } } } for(int i=f;i<=v;i++) { if(dp[f][i]>ans) { ans=dp[f][i]; // p=path[f][i]; p=i; } } printf("%d ",ans); print(f,p); return 0; }