题目大意:
给出矩形的长宽高,每个矩形可用次数不限,如果一个矩形的长宽都严格小于另一个矩形的长宽(相等不算),那么,这个矩形就可以叠在另一个矩形上,问可以达到的最大高度
思路:
每个矩形的状态只有三种 GTA 模型对于每个矩形,拆分成三个,然后求长宽都递减的子序列。
感想:
豆豆讲的典型例题,,他说他坐过去好久了,,没仔细给我讲了额,,,
AC代码:
- #include <stdio.h>
- #include<iostream>
- #include<cstdio>
- #include<string.h>
- #include<algorithm>
- using namespace std;
- int dp[111];
- struct ck
- {
- int c;
- int k;
- friend bool operator < (const ck &a,const ck &b)
- {
- if(a.c>b.c) return true;
- if(a.c==b.c&&a.k>b.k) return true;
- return false;
- }
- };
- struct rx
- {
- ck num;
- int len;
- friend bool operator < (const rx &a,const rx &b)
- {
- return a.num<b.num;
- }
- }arr[100005];
- void paopao(int &a,int &b,int &c)
- {
- int t;
- if(a<b)
- {
- t=a;
- a=b;
- b=t;
- }
- if(a<c)
- {
- t=a;
- a=c;
- c=t;
- }
- if(b<c)
- {
- t=b;
- b=c;
- c=t;
- }
- return ;
- }
- int main()
- {
- int i,n,a,b,c,j;
- //freopen("r.txt","r",stdin);
- int cass=0;
- while(~scanf("%d",&n))
- {
- if(n==0) break;
- cass++;
- int pp=0;
- for(i=0;i<n;i++)
- {
- scanf("%d%d%d",&a,&b,&c);
- paopao(a,b,c);
- arr[pp].num.c=b;arr[pp].num.k=c;arr[pp++].len=a;
- arr[pp].num.c=a;arr[pp].num.k=c;arr[pp++].len=b;
- arr[pp].num.c=a;arr[pp].num.k=b;arr[pp++].len=c;
- }
- sort(arr,arr+pp);
- for(i=0;i<pp;i++)
- dp[i]=arr[i].len;
- int temp;
- for(i=1;i<pp;i++)
- {
- temp=0;
- for(j=0;j<i;j++)
- {
- if(arr[j].num.c>arr[i].num.c&&arr[j].num.k>arr[i].num.k)
- {
- temp=max(temp,dp[j]);
- }
- }
- dp[i]=temp+arr[i].len;
- }
- temp=dp[0];
- for(i=0;i<pp;i++)
- {
- if(dp[i]>temp)
- temp=dp[i];
- }
- cout<<"Case "<<cass<<": maximum height = ";
- cout<<temp<<endl;
- }
- return 0;
- }