花店橱窗 动态规划 题解

啊! 整整一个小时 调出了这道卡死人的动态规划题~

非常激动

题目内容如下

1090: B10-动态规划-花店橱窗

时间限制: 1 Sec  内存限制: 128 MB
提交: 13  解决: 7
[提交] [状态] [讨论版] [命题人:外部导入]

题目描述

    xq和他的老婆xz最近开了一家花店,他们准备把店里最好看的花都摆在橱窗里。但是他们有很多花瓶,每个花瓶都具有各自的特点,因此,当各个花瓶中放入不同的花束时,会产生不同的美学效果。为了使橱窗里的花摆放的最合适,他们得想个办法安排每种花的摆放位置。
    可是因为xq和xz每天都太忙,没有时间设计橱窗里花的摆法,所以他们想让你帮他们求出花摆放的最大美观程度和每种花所放的位置。
    注:标号小花必须放在标号大的前面。
 
 
    每种花放在不同的瓶子里会产生不同的美观程度,美观程度可能是正数也可能是负数。
 
    上述例子中,花瓶与花束的不同搭配所具有的美观程度,如下表所示:
 
                             花    瓶
 
                      1     2    3    4    5
       1 (杜鹃花)     7    23   -5  -24   16
       2 (秋海棠)     5    21   -4   10   23
       3 (康乃馨)    -21    5   -4  -20   20
 
 
    根据上表,杜鹃花放在花瓶2中,会显得非常好看;但若放在花瓶4中则显得十分难看。
 
 

输入

第1行:两个整数F和V,表示xq和xz一共有F种花,V个花瓶。(1<=F<=V<=100)
第2行到第F+1行:每行有V个数,表示花摆放在不同花瓶里的美观程度值value。(美观程度和不超过maxint,美观程度有正有负。)
 

输出

输出有两行:第一行为输出最大美观程度和的值,第二行有F个数表示每朵花应该摆放的花瓶的编号。

样例输入

3 5 
7 23 -5 -24 16
5 21 -4 10 23
-21 5 -4 -20 20

样例输出

53
2 4 5

提示



 
 

来源/分类

这一题我的思路就是用dp[i][j]来表示第i种花放在第j个位置  累计到这种花获得的最大价值


//f[i][j]=max(f[i][j],f[i-1][k]+v[i][j])
#include<bits/stdc++.h> using namespace std; int v[105][105],dp[105][105]; int f,V; void Printout(int maxn,int i,int j){ if(i==0) return; for(int k=1;k<=V;k++) if(dp[i-1][k]+v[i][j]==maxn){ Printout(dp[i-1][k],i-1,k); break; } cout<<j<<" "; } int main(){ cin>>f>>V; for(int i=1;i<=f;i++) for(int j=1;j<=V;j++) scanf("%d",&v[i][j]),dp[i][j]=-10000; for(int i=1;i<=f;i++){ for(int j=i;j<=V-(f-i);j++){ for(int k=i-1;k<j;k++){ dp[i][j]=max(dp[i][j],dp[i-1][k]+v[i][j]); } } } int maxn=-1; for(int i=f;i<=V;i++) maxn=max(maxn,dp[f][i]); int ii,jj; for(int i=f;i<=V;i++) if(dp[f][i]==maxn){ ii=f; jj=i; break; } cout<<maxn<<endl; Printout(maxn,ii,jj); return 0; }

这一道题死活不过整理了如下几个错误原因

1.没有处理好每层循环的边界

2.没有把dp数组初始化!?我也不知道是什么bug 反正不初始化就会出各种神奇的错误

3.我那个神奇的递归打印路径函数 一开始在主函数里传的参数错了  我一开始写的Printout(maxn,f,V) 但是最后一种花不一定放在最后一个位置鸭

加油 继续努力 梦想一定就在不远的前方~

猜你喜欢

转载自www.cnblogs.com/Tidoblogs/p/11257360.html