HDU 1069 Monkey and Banana
2012-02-04 09:09
337 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069
几天没写博客了,嘿嘿,该总结一下了。如果不是课件上把这题规划到动态规划里面我一直都把它当贪心考虑,汗ing。
题目大意:给你N种箱子,给出它的长,宽,高;(每种箱子视为无限个)。把箱子叠层起来,问最大能叠多高。但要求的必须在上面一个箱子的长和宽都要比它下面的箱子的长和宽都小。
思路:其实就是求最长的单调递减序列。题目上说每种可以有无限个,那么就把N中类型的箱子都列举出来,全部进行比较。在长和宽的递减下,求最大能得出的最大高度了。
代码:
几天没写博客了,嘿嘿,该总结一下了。如果不是课件上把这题规划到动态规划里面我一直都把它当贪心考虑,汗ing。
题目大意:给你N种箱子,给出它的长,宽,高;(每种箱子视为无限个)。把箱子叠层起来,问最大能叠多高。但要求的必须在上面一个箱子的长和宽都要比它下面的箱子的长和宽都小。
思路:其实就是求最长的单调递减序列。题目上说每种可以有无限个,那么就把N中类型的箱子都列举出来,全部进行比较。在长和宽的递减下,求最大能得出的最大高度了。
代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struct banana { int len;//**长**// int wid;//**宽**// int high; //**高**// int dp;//**保存最大高度**// }w[101]; bool comp(banana a,banana b)//**按长跟宽进行排序**// { if(a.len>b.len) return true; if(a.len==b.len&&a.wid>b.wid) return true; return false; } int main() { int n,i,j,x,y,z,max,count,num=1; while(~scanf("%d",&n)&&n) { memset(w,0,sizeof(w)); count=0; for(i=0;i<=n-1;i++) { scanf("%d %d %d",&x,&y,&z); w[count].len=x;w[count].wid=y;w[count].high=z;w[count].dp=z;//**将每种箱子的情况都列举出来**// count++; w[count].len=x;w[count].wid=z;w[count].high=y;w[count].dp=y; count++; w[count].len=y;w[count].wid=x;w[count].high=z;w[count].dp=z; count++; w[count].len=y;w[count].wid=z;w[count].high=x;w[count].dp=x; count++; w[count].len=z;w[count].wid=x;w[count].high=y;w[count].dp=y; count++; w[count].len=z;w[count].wid=y;w[count].high=x;w[count].dp=x; count++; } sort(w,w+count,comp); max=w[0].dp;//**还是跟原来一样,最好不要设为什么0,-1,(吃过几次亏),可以估计出来就求出来**// for(i=count-2;i>=0;i--)//**跟数塔一样的比较,从后往前进行比较,不过貌似前往后也行**// { for(j=i+1;j<=count-1;j++) { if(w[i].len>w[j].len&&w[i].wid>w[j].wid)//**保证上面箱子的长和宽都比下面的小**// { if(w[i].dp<w[j].dp+w[i].high)//**经典的求最大递减的DP**// { w[i].dp=w[j].dp+w[i].high; } } } if(w[i].dp>max)//**更新最高值**// { max=w[i].dp; } } printf("Case %d: maximum height = %d\n",num++,max); } return 0; }下面还有一段最开始写的代码,测试数据都对了,但提交就是不对,求大牛指点。。。。。。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struct banana { int len; int wid; int high; }w[101]; bool comp(banana a,banana b) { if(a.len>b.len) return true; if(a.len==b.len&&a.wid>b.wid) return true; return false; } int main() { int n,i,j,x,y,z,count,max,ans,num=1,dp[101]; while(~scanf("%d",&n)&&n) { memset(w,0,sizeof(w)); count=0; for(i=0;i<=n-1;i++) { scanf("%d %d %d",&x,&y,&z); w[count].len=x;w[count].wid=y;w[count].high=z; count++; w[count].len=x;w[count].wid=z;w[count].high=y; count++; w[count].len=y;w[count].wid=x;w[count].high=z; count++; w[count].len=y;w[count].wid=z;w[count].high=x; count++; w[count].len=z;w[count].wid=x;w[count].high=y; count++; w[count].len=z;w[count].wid=y;w[count].high=x; count++; } sort(w,w+count,comp); for(i=0;i<=count-1;i++) { dp[i]=w[i].high; } max=dp[0]; for(i=count-2;i>=0;i--) { for(j=i+1;j<=count-1;j++) { if(w[i].len>w[j].len&&w[i].wid>w[j].wid) { if(dp[i]<dp[j]+w[i].high) { dp[i]=dp[j]+w[i].high; } } } if(dp[i]>max) { max=dp[i]; } } printf("Case %d: maximum height = %d\n",num++,max); } return 0; }
相关文章推荐
- HDU 1069 Monkey and Banana(动态规划)
- hdu 1069 Monkey and Banana
- hdu 1069 Monkey and Banana
- HDU 1069 Monkey and Banana (最长上升子序列)
- HDU - 1069 Monkey and Banana(DAG)
- HDU 1069 Monkey and Banana
- HDU 1069 Monkey and Banana
- hdu 1069 Monkey and Banana(记忆搜)
- [HDU 1069 Monkey and Banana]DP
- HDU 1069 Monkey and Banana
- HDU 1069 Monkey and Banana DP
- HDU 1069 Monkey and Banana(最大递增子串)
- hdu 1069 Monkey and Banana
- hdu 1069 Monkey and Banana (dp)
- hdu 1069 Monkey and Banana
- 三维最长上升子序列问题——HDU 1069 Monkey and Banana
- HDU 1069 Monkey and Banana——DP
- HDU-1069-Monkey and Banana
- HDU 1069 Monkey and Banana(dp)
- hdu 1069 Monkey and Banana