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

来源:互联网 发布:猫叔100的淘宝 编辑:程序博客网 时间:2024/06/10 03:54

因为是偏序关系所以很明显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;}elsefor(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;}}

0 0
原创粉丝点击