标签: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; } }
标签:dp
原文地址:http://blog.csdn.net/ac_0_summer/article/details/45578253