您的位置:首页 > 其它

hdoj1069 Monkey and Banana(DP)

2017-06-08 10:47 288 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  杭电 算法