您的位置:首页 > 其它

UVA 437 The Tower of Babylon 巴比伦塔(DAG上的动态规划)

2017-02-22 18:44 330 查看
题意:给n中立方体,每种无限多个,求能堆成塔的最高高度(必须严格满足上面的长宽小于下面的)

AC代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=30+2;
struct node{
int x,y,z;
node(int x=0,int y=0,int z=0):x(x),y(y),z(z){}
bool operator<(const node& n)const {
return x<n.x&&y<n.y || x<n.y&&y<n.x;
}
}nt[maxn*3];
int g[maxn*3][maxn*3];
int d[maxn*3];
int n;

int dp(int i,int h){
int& ans=d[i];
if(ans>0)return ans;
ans=h;
for(int j=0;j<n*3;j++)
if(g[i][j])ans=max(ans,dp(j,nt[j].z)+h);
return ans;
}
int main(){
int count1=0;
while(scanf("%d",&n)==1 && n){
int c=0;
for(int i=0;i<n;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
nt[c++]=node(x,y,z); //第三位表示高度
nt[c++]=node(x,z,y);
nt[c++]=node(y,z,x);
}
memset(d,0,sizeof(d));
memset(g,0,sizeof(g));
for(int i=0;i<n*3;i++)
for(int j=0;j<n*3;j++)
if(nt[i]<nt[j])g[i][j]=1;

int ans=-1e5;
for(int i=0;i<n*3;i++)
ans=max(ans,dp(i,nt[i].z));
printf("Case %d: maximum height = %d\n",++count1,ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: