花店橱窗 (dp-路径记录)
2018-03-09 21:46
134 查看
第一问很简单。
f[i][j]表示前i朵花放在前j个花瓶里时的最大美学值,且此时第i朵花必须放在第j个花瓶里。则有状态转移方程:
f[i][j]=max(f[i-1][k]+a[i][j]) ( i-1<=k<=j-1)
k范围限制是因为至少已经有前i-1个花瓶放了花。
第二问记录每次决策。可以用递归写,有机会(没有)试试。这里采用的方法是,声明一个 pre[i][j] ,记录是由 f[i-1] 的哪个状态得到f[i][j]的最优值。
void init() { memset(a,0,sizeof(a)); read(F);read(v); for(int i=1;i<=F;++i) for(int j=1;j<=v;++j) read(a[i][j]),f[i][j]=-2e9;//初始全部为不合法,因为不是每个花瓶都放花的。 } void work() { for(int i=1;i<=F;++i) f[0][i]=0; for(int i=1;i<=F;++i) for(int j=i;j<=v-F+i;++j)// 至少要留下F-i个花瓶给剩下的花。 for(int k=i-1;k<=j-1;++k) if(f[i-1][k]+a[i][j]>f[i][j]) { pre[i][j]=k;//记录前驱。 f[i][j]=f[i-1][k]+a[i][j]; } ans=0; for(int i=1;i<=v;++i) if(ans<f[F][i]) ans=f[F][i],Ans[F]=i;//先找到最大美学值,其对应的j也是第F朵fafa所放的花瓶。 printf("%d\n",ans); for(int i=F;i>=2;--i) Ans[i-1]=pre[i][Ans[i]];//Ans[i]表示第i朵花放的花瓶j,它的前驱即是第i-1朵花的选择。 for(int i=1;i<F;++i) printf("%d ",Ans[i]); printf("%d",Ans[F]); }
相关文章推荐
- [IOI1999]花店橱窗布置(DP路径记录)
- hdu1160 FatMouse's Speed--DP&记录路径
- rqnoj 496 [IOI1999]花店橱窗布置 (简单dp)
- 记录路径dp-4713-Permutation
- URAL 1078. Segments(记录路径的简单dp)
- Codeforces 507E Breaking Good【最短路SPFA+Dp+记录路径】好题~~~
- hdu 1160 dp (二维最长上升子序列 记录路径
- URAL 1029 Ministry(记录路径的dp)
- hdu1224 dp(dp + 栈/父亲数组记录路径)
- Codeforces 454D Little Pony and Harmony Chest【思维+状压Dp+记录路径】好题!
- hdu 1160 dp (二维最长上升子序列 记录路径
- uva 10453 - Make Palindrome(dp, 记录路径)
- 【基础dp路径记录】HDU 1160 FatMouse's Speed
- 最大连续子段和+记录路径 【DP 初步】
- hdu 1160 dp (二维最长上升子序列 记录路径
- POJ 2264 Advanced Fruits DP+记录路径
- ural1183&&poj1141 Brackets Sequence(区间DP+记录路径)
- DP之花店橱窗布置
- Uva 10400 Game Show Math (DP+记录路径)
- UVA624(dp记录路径问题)