因为是偏序关系所以很明显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;
}
}原文:http://blog.csdn.net/ac_0_summer/article/details/45578253