hdoj1069 Monkey and Banana(DP)

来源:互联网 发布:贝恩杯 知乎 编辑:程序博客网 时间:2024/06/05 06:51

dp[i]代表第i块砖头为顶层时的最大高度。

dp[i]=max{dp[j]+b[i].z,dp[i]}。

因为一类砖头可以拿任意块,所以一类砖头最多可以有3种高度。

最后目的是找到一个单挑递减的序列使得累起来的高度之和最大。

代码如下:

#include<stdio.h>#include<math.h> #include<string> #include<algorithm>using namespace std;struct block{int x,y,z;};bool cmp(const block a,const block b){if(a.x==b.x)return a.y>b.y;else return a.x>b.x;}int max1(int a,int b){return (a>b)?a:b;}block b[555];int dp[555];int main(){int n,i,k,j,x,y,z,max,t=1;while(~scanf("%d",&n)&&n){k=0;max=-1;for(i=0;i<n;i++){scanf("%d%d%d",&x,&y,&z);b[k].x=max1(x,y);b[k].y=min(x,y);b[k].z=z;k++;b[k].x=max1(x,z);b[k].y=min(x,z);b[k].z=y;k++;b[k].x=max1(z,y);b[k].y=min(z,y);b[k].z=x;k++;}sort(b,b+k,cmp);for(i=0;i<k;i++){dp[i]=b[i].z;for(j=0;j<i;j++)if(b[j].x>b[i].x&&b[j].y>b[i].y)if(dp[j]+b[i].z>dp[i])dp[i]=dp[j]+b[i].z;if(max<dp[i])max=dp[i];}printf("Case %d: maximum height = %d\n",t++,max);}return 0;}