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;
}
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;
}
相关文章推荐
- 【算法竞赛入门经典】DAG上的动态规划 例题9-2 UVa437
- UVA 437 巴比伦塔(DAG上的动态规划)
- UVa437 两种做法(DAG上的动态规划)
- uva 437 DAG上的动态规划
- The Tower of Babylon UVA - 437 (DAG上的动态规划变形,记忆化搜索)
- UVA 437 例题9-2 巴比伦塔 (DAG上的动态规划)
- UVA 437 The Tower of Babylon(DAG上的动态规划)
- DAG的动态规划 (UVA 1025 A Spy in the Metro)
- UVA103动态规划之DAG上的最长路及其字典序
- UVA 437 The Tower of Babylon(DAG上的动态规划)
- UVA 103 Stacking Boxes (DAG上的动态规划)
- UVa 1025 (DAG 上的动态规划,有固定终点的最短时间,逆推法)
- UVa 103 Stacking Boxes --- DAG上的动态规划
- uva 1025 A Spy in the Metro DAG上的动态规划(固定终点)
- The Tower of Babylon DAG上的动态规划+uva
- DAG上的动态规划--硬币问题
- DAG上的动态规划之再次思考(QDUoj分辣条2)
- 动态规划-DAG-硬币问题
- 【暑假】[深入动态规划]UVAlive 4794 Sharing Chocolate
- uva 437 The Tower of Babylon (DAG)