原题目链接:HDU1069
HDU 动态规划 贪心
题意
题意是堆箱子、要求上面的箱子的长和宽都小于下面箱子的长和宽
想法
因为每块砖有三种摆法(高和底面积不同),可以把这三种情况当成不同的三块砖,加入brick数组中。注意,一定要分清长和宽,长要比宽长,这样在后面dp的过程中可以保证长边和长边比较、短边和短边比较。
所以
- 要么保证长比宽长,每次录入3个面
- 要么每次录入6个面
因为这个卡了好久
代码
15ms
#include
using namespace std;int dp[2000];struct node{int l, w, h;
}brick[2000]; bool cmp(node a, node b)
{if(a.l != b.l){return a.l > b.l; }else{return a.w > b.w;}
}
int main()
{int n;int tmp[3], ans, k;int kase &#61; 0;while(scanf("%d",&n)!&#61;EOF){if(n &#61;&#61;0){return 0;}k &#61; 0;for(int i &#61;0;i < n;i&#43;&#43;){scanf("%d%d%d",&tmp[0],&tmp[1],&tmp[2]);sort(tmp,tmp&#43;3);brick[k].l&#61;tmp[0];brick[k].w&#61;tmp[1];brick[k&#43;&#43;].h&#61;tmp[2];brick[k].l&#61;tmp[1];brick[k].w&#61;tmp[2];brick[k&#43;&#43;].h&#61;tmp[0];brick[k].l&#61;tmp[0];brick[k].w&#61;tmp[2];brick[k&#43;&#43;].h&#61;tmp[1];}sort(brick, brick &#43; k, cmp);ans &#61; -1;for(int i &#61; 0;i < k;i&#43;&#43;){dp[i] &#61; brick[i].h;for(int j&#61; i-1;j >&#61;0; j--){if(brick[j].l > brick[i].l && brick[j].w > brick[i].w){dp[i] &#61; max(dp[i], dp[j] &#43; brick[i].h);}}ans &#61; max(ans, dp[i]);}printf("Case %d: maximum height &#61; %d\n",&#43;&#43;kase,ans);}
}