HDOJ HDU 1069 Monkey and Banana
2017-09-10 21:09
337 查看
HDOJ 1069 Monkey and Banana
题目
点此查看 HDOJ HDU 1069 Monkey and Banana分类
动态规划题意
猴子要为了吃到研究人员放在高处的香蕉要尽可能 累 更高的箱子规则
每种箱子无限
每次累时 上面的箱子的长宽 要严格小于 下面的
题解
首先箱子无限 意味着 每种箱子 都可以 有三种长宽 例如 长宽高 a,b,c、a,c,b、b,c,a接下来解释DP的方法
i 表示当前箱子号 b[i]表示箱子结构体 b[i].x 表示 i的 长 b[i].y 表示 i的 宽
b[i].h 表示 i的 高
dp[i]表示 以 i 为顶的最大高
dp[i] = max(dp[i],b[i].h + dp[j])(0 <= j < i)(b[i].x < b[j].x && b[i].y < b[j].x)
下面给个dp的表 辅助理解
输入示例
2
6 8 10
5 5 5
箱子种类(长,宽,高)
10 6 8
10 8 6
8 6 10
8 10 6
6 8 10
6 10 8
5 5 5
5 5 5
5 5 5
5 5 5
5 5 5
5 5 5
动态规划表
8
8 6
6 8 16
16 6 8 6
6 16 6 8 16
16 6 16 6 8 8
8 16 6 16 6 8 21
21 8 16 6 16 6 8 21
21 21 8 16 6 16 6 8 21
21 21 21 8 16 6 16 6 8 21
21 21 21 21 8 16 6 16 6 8 21
21 21 21 21 21 8 16 6 16 6 8 21
第一个箱子 高 是 8
第二个箱子 不能把之前的箱子放在上面 高为 6
第三个箱子 首先可以放在第一个上 修改数组为 10 + 8 其次也可以放在 2 上 为 10 + 6 < 18 所以第三个箱子再顶的最大高为 18
依次类推
结果为 Case 1: maximum height = 21
代码
#include <iostream> #include <cstring> #include <algorithm> #define maxn 200 using namespace std ; struct block { int x; int y; int h; }; block b[maxn]; int dp[maxn]; bool cmp(const block & a,const block & b); int main() { int n,dx,dy,dh,ans,t = 1; while(cin >> n && n) { memset(dp,0,sizeof(dp)); for(int i = 0;i < n;i++) { cin >> dx >> dy >> dh; b[i*6].x = dx; b[i*6].y = dy; b[i*6].h = dh; b[i*6+1].x = dx; b[i*6+1].y = dh; b[i*6+1].h = dy; b[i*6+2].x = dy; b[i*6+2].y = dx; b[i*6+2].h = dh; b[i*6+3].x = dy; b[i*6+3].y = dh; b[i*6+3].h = dx; b[i*6+4].x = dh; b[i*6+4].y = dx; b[i*6+4].h = dy; b[i*6+5].x = dh; b[i*6+5].y = dy; b[i*6+5].h = dx; } /* for(int i = 0;i < n;i++) { for(int j = 0;j < 6;j++) cout << b[i*6+j].x << " " << b[i*6+j].y << " "<< b[i*6+j].h << " " << endl; } cout << endl;*/ sort(b,b+n*6,cmp); /* for(int i = 0;i < n;i++) { for(int j = 0;j < 6;j++) cout << b[i*6+j].x << " " << b[i*6+j].y << " "<< b[i*6+j].h << " " << endl; }*/ for(int i = 0;i < 6*n;i++) { dp[i] = b[i].h; for(int j = i-1;j >=0;j--) if(b[j].x > b[i].x && b[j].y > b[i].y) dp[i] = max(dp[i],dp[j]+b[i].h); } ans = 0; for(int i = 0;i < 6 *n;i++) ans = max(ans,dp[i]); cout << "Case " << t++ << ": maximum height = " << ans << endl; } return 0; } bool cmp(const block & a,const block & b) { if(a.x > b.x) return true; else return false; }
相关文章推荐
- hdu 1069 Monkey and Banana (dp)
- hdu 1069 Monkey and Banana--最长递增子序列
- hdu 1069 Monkey and Banana 最长上升子序列。
- HDU 1069 Monkey and Banana DP
- HDU1069——Monkey and Banana(动态规划)
- hdu1069 Monkey and Banana
- HDU 1069 - Monkey and Banana
- HDU 1069 Monkey and Banana
- hdu 1069 Monkey and Banana (DP)
- HDU - 1069 Monkey and Banana(DAG)
- HDU 1069 Monkey and Banana
- hdu 1069 Monkey and Banana(dp)
- hdu 1069 Monkey and Banana
- hdu -1069 Monkey and Banana【贪心+dp】
- Problem E:Monkey and Banana(HDU 1069)
- hdu 1069 Monkey and Banana(记忆搜)
- hdu 1069 —— Monkey and Banana
- HDU1069——Monkey and Banana(动态规划)
- hdu 1069 Monkey and Banana
- hdu1069 Monkey and Banana(dp+贪心)