题目大意:
给你n个尺寸的长方形
其中每个长方形可以取无限个
问你叠起来最高的高度是多少(顶部长宽必须严格减少,不能等于
思路:
DAG上的动态规划
虽然说是无限其实一个尺寸的长方形最多取三个
把每个长方形三条边都作为高度
这样一个长方形就有三个点,记录这个点的长宽高
然后我们把每个点长宽比另一个点大的点连一条边
之后利用dfs求出答案即可
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int N=35;
struct node{
int a,b,c;
bool operator < (const node&rhs)const{
return ((rhs.a>a&&rhs.b>b)||(rhs.b>a&&rhs.a>b));
}
};
node t[N*3];
int d[N*3];
vector<int>e[N*3];
int dfs(int x,int h){
if(d[x])return d[x];
d[x]=t[x].c;
for(int i=0;i<e[x].size();i++){
int y=e[x][i];
d[x]=max(dfs(y,t[y].c)+h,d[x]);
}
return d[x];
}
int main()
{
int n;
int kase=1;
while(cin>>n&&n){
memset(d,0,sizeof(d));
for(int i=0;i<3*n;i+=3){
int x,y,z;
cin>>x>>y>>z;
t[i]={x,y,z};
t[i+1]={y,z,x};
t[i+2]={z,x,y};
}
for(int i=0;i<3*n;i++){
for(int j=0;j<3*n;j++){
if(t[i]<t[j]){
e[j].push_back(i);
}
}
}
int ans=0;
for(int i=0;i<3*n;i++){
ans=max(ans,dfs(i,t[i].c));
}
cout<<"Case "<<kase++<<": maximum height = ";
cout<<ans<<endl;
for(int i=0;i<3*n;i++)e[i].clear();
}
return 0;
}