码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1069 Monkey and Banana

时间:2015-04-23 15:45:09      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:dp

感觉纯dp的题基本上都是给一些数或者物体,求一个最大值什么的

这道题上一层的和下一层的摆放有限制关系,所以要加个标识位,标记原来的顶层是哪一个,然后就是dp了

某一种方块无限供应,即相当于每一种方块,其实都是三种方块,而据题目要求每一种方块最多只能放一块

把坐标按x排序

dp[i][j]表示叠i层,最顶层放第j种方块时的最大高度

则dp[i][j]=max(dp[i][j],dp[i-1][0、1、2....l]+z[j])

然后加个判断条件

if((r[k].x>r[j].x&&r[k].y>r[j].y)||(r[k].y>r[j].x&&r[k].x>r[j].y))
刚开始写成了
if(r[k].x>r[j].x&&r[k].y>r[j].y)
一直在WA

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int inf=1<<30;
#define N 105
struct Rec{
	int x,y,z;
}r[N];
int cmp(Rec a,Rec b){
	if(a.x==b.x) return a.y>b.y;
	return a.x>b.x;
}

int dp[N][N];//dp[i][j]:前i层块中,第j种方块放在顶层时的最大高度 
void init(){
	memset(dp,0,sizeof(dp));
}
int main(){
	#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
	#endif
	int n,cas=1;
	
	while(scanf("%d",&n),n){
		init();
		int l=1,xx,yy,zz;
		for(int i=0;i<n;i++){
			scanf("%d%d%d",&xx,&yy,&zz);
			r[l].x=xx;	r[l].y=yy;	r[l++].z=zz;
			//r[l].x=xx;	r[l].y=zz;	r[l++].z=yy;
			r[l].x=yy;	r[l].y=zz;	r[l++].z=xx;
			//r[l].x=yy;	r[l].y=xx;	r[l++].z=zz;
			r[l].x=zz;	r[l].y=xx;	r[l++].z=yy;
			//r[l].x=zz;	r[l].y=yy;	r[l++].z=xx;
		}
		r[0].x=inf;r[0].y=inf;r[0].z=inf;
		sort(r+1,r+l,cmp);
		for(int i=1;i<l;i++) {//i是塔的层数 
			for(int j=i;j<l;j++){//j<i是没有意义的,因为j下面最多放j-1个数,而i代表层数 
				for(int k=0;k<l;k++){
					if((r[k].x>r[j].x&&r[k].y>r[j].y)||
						(r[k].y>r[j].x&&r[k].x>r[j].y)) dp[i][j]=max(dp[i][j],dp[i-1][k]+r[j].z);
				}
				 
			}
		}
		int ans=0;
		for(int i=1;i<l;i++) {
			for(int j=i;j<l;j++){
				ans=max(ans,dp[i][j]);
			}
		}
		printf("Case %d: maximum height = %d\n",cas++,ans);
	}
}


HDU 1069 Monkey and Banana

标签:dp

原文地址:http://blog.csdn.net/lj94093/article/details/45221353

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!