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

HDU 4001--Dp--(第一道dp)

时间:2015-05-08 14:59:57      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:dp

因为是偏序关系所以很明显dp,先排序再dp就得到结果了。

     1.注意理解dp的思想

      2.注意这里的排序。从低到高按最容易满足条件的并且要求最高的开始排

      3.用int直接算面积会溢出,要么设为long long 要么不直接算面积

代码:

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
long long ans,dp[1009];
struct h{
	int len,wid,thk,d;
}code[1009];
bool cmp(h a,h b)
{
	if(a.len!=b.len) return a.len<b.len;
    if(a.wid!=b.wid) return a.wid<b.wid;
    return a.d>b.d;
}
void DP()
{
	ans=-2;
	for(int i=1;i<=n;i++){
		if(code[i].d==0)
		for(int j=i-1;j>0;j--){
			if(code[j].len<=code[i].len&&code[j].wid<=code[i].wid&&(dp[j]+code[i].thk)>dp[i])
			  dp[i]=dp[j]+code[i].thk;
		}
		else if(code[i].d==1)
		for(int j=i-1;j>0;j--){
			if(code[j].len<=code[i].len&&code[j].wid<=code[i].wid&&(code[j].len<code[i].len||code[j].wid<code[i].wid)&&(dp[j]+code[i].thk)>dp[i])
			dp[i]=dp[j]+code[i].thk;
		}
		else
		for(int j=i-1;j>0;j--){
			if(code[j].len<code[i].len&&code[j].wid<code[i].wid&&(dp[j]+code[i].thk)>dp[i])
			dp[i]=dp[j]+code[i].thk;
		}
		if(ans<dp[i]) ans=dp[i];
	}
}
int main()
{
	while(cin>>n){
		if(!n) break;
		for(int i=1;i<=n;i++){
			cin>>code[i].len>>code[i].wid>>code[i].thk>>code[i].d;
			if(code[i].len<code[i].wid) swap(code[i].len,code[i].wid);
		}
		sort(code+1,code+n+1,cmp);
		for(int i=1;i<=n;i++) dp[i]=code[i].thk;
		DP();
		cout<<ans<<endl;
	}
}

HDU 4001--Dp--(第一道dp)

标签:dp

原文地址:http://blog.csdn.net/ac_0_summer/article/details/45578253

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