标签:
题意:给一些指定长宽高的砖,求能累出的最大高度,不同砖有不同编号,每种编号对下面的砖做出了限制
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 0
Sample Output
24 11
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 int n,m,t; 9 const int maxn=1005; 10 __int64 dp[maxn]; 11 struct node 12 { 13 int l,w,d,c; 14 }a[maxn]; 15 bool cmp(node a,node b) 16 { 17 if(a.l!=b.l) return a.l<b.l; 18 if(a.w!=b.w) return a.w<b.w; 19 return a.d>b.d; 20 } 21 int main() 22 { 23 int i,j,k; 24 while(scanf("%d",&n)!=EOF&&n) 25 { 26 for(i=1;i<=n;i++) 27 { 28 scanf("%d%d%d%d",&a[i].l,&a[i].w,&a[i].c,&a[i].d); //长宽高 29 if(a[i].l<a[i].w) swap(a[i].l,a[i].w); 30 } 31 sort(a+1,a+n+1,cmp); 32 __int64 ans=0; 33 for(i=1;i<=n;i++) 34 { 35 dp[i]=a[i].c; 36 for(j=1;j<i;j++) 37 { 38 if(a[i].d==0&&a[i].w>=a[j].w&&a[i].l>=a[j].l) 39 { 40 dp[i]=max(dp[i],dp[j]+a[i].c); 41 } 42 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)) 43 { 44 dp[i]=max(dp[i],dp[j]+a[i].c); 45 } 46 if(a[i].d==2&&a[i].w>a[j].w&&a[i].l>a[j].l) 47 { 48 dp[i]=max(dp[i],dp[j]+a[i].c); 49 } 50 } 51 if(dp[i]>ans) ans=dp[i]; 52 } 53 printf("%I64d\n",ans); 54 } 55 return 0; 56 }
标签:
原文地址:http://www.cnblogs.com/cnblogs321114287/p/4286292.html