题意:给一些指定长宽高的砖,求能累出的最大高度,不同砖有不同编号,每种编号对下面的砖做出了限制
dp
注意输出要用%I64d,否则会wa,以后不用%lld了
Sample Input
3 10 10 12 0 10 10 12 1 10 10 11 2 2 10 10 11 1 10 10 11 1 0Sample Output
24 11
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> using namespace std; int n,m,t; const int maxn=1005; __int64 dp[maxn]; struct node { int l,w,d,c; }a[maxn]; bool cmp(node a,node b) { if(a.l!=b.l) return a.l<b.l; if(a.w!=b.w) return a.w<b.w; } int main() { int i,j,k; #ifndef ONLINE_JUDGE freopen("1.in","r",stdin); #endif while(scanf("%d",&n)!=EOF&&n) { for(i=1;i<=n;i++) { scanf("%d%d%d%d",&a[i].l,&a[i].w,&a[i].c,&a[i].d); //长宽高 if(a[i].l<a[i].w) swap(a[i].l,a[i].w); } sort(a+1,a+n+1,cmp); __int64 ans=0; for(i=1;i<=n;i++) { dp[i]=a[i].c; for(j=1;j<i;j++) { if(a[i].d==0&&a[i].w>=a[j].w&&a[i].l>=a[j].l) { dp[i]=max(dp[i],dp[j]+a[i].c); } if(a[i].d==1&&a[i].w>=a[j].w&&a[i].l>=a[j].l&&(a[i].w>a[j].w||a[i].l>a[j].l)) { dp[i]=max(dp[i],dp[j]+a[i].c); } if(a[i].d==2&&a[i].w>a[j].w&&a[i].l>a[j].l) { dp[i]=max(dp[i],dp[j]+a[i].c); } } if(dp[i]>ans) ans=dp[i]; } printf("%I64d\n",ans); } return 0; }
时间: 2024-10-15 13:46:38