UVA—437 (DAG最长路算法)The Tower of Babylon
原题链接: UVA-437

测试样例
Sample Input
1
10 20 30
2
6 8 10
5 5 5
7
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27
0
Sample Output
Case 1: maximum height = 40
Case 2: maximum height = 21
Case 3: maximum height = 28
Case 4: maximum height = 342
题意: 有 n n n种立方体,每种有无穷多个。你可以旋转这些立方体。要求选取一些立方体摞成一根尽量高的柱子,使得每个立方体的底面长和宽分别严格小于它下方立方体的底面长宽。
解题思路: 如果有做过杭电的1069就知道这道题和杭电那道题一模一样,只是表述不同,这里贴一下我那道题的题解。再写这道题的题解只是为了记录与巩固,毕竟这题出的是针不戳。
AC代码
/*
*blog:https://blog.csdn.net/hzf0701
*邮箱:unique_powerhouse@qq.com
*注:文章若有任何问题请私信我或评论区留言,谢谢支持。
*/
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
using namespace std;
typedef long long ll;
const int maxn=1e5;//数组所开最大值
const int mod=1e9+7;//模
const int inf=0x3f3f3f3f;//无穷大
struct block{
int x,y,z;
};
int n,kase=1;
int dp[250];
bool cmp(block a,block b){
if(a.x!=b.x){
return a.x<b.x;
}
else if(a.y!=b.y){
return a.y<b.y;
}
else{
return a.z<b.z;
}
}
void solve(vector<block> &blocks){
sort(blocks.begin(),blocks.end(),cmp);
int maxx=0,len=blocks.size();
memset(dp,0,sizeof(dp));
rep(i,0,len-1){
dp[i]=blocks[i].z;//最下面这一块是它自己,接下来往前堆叠。
rep(j,0,i-1){
if(blocks[i].x>blocks[j].x&&blocks[i].y>blocks[j].y){
dp[i]=max(dp[i],dp[j]+blocks[i].z);
}
}
maxx=max(maxx,dp[i]);
}
cout<<"Case "<<kase++<<": maximum height = ";
cout<<maxx<<endl;
}
int main(){
while(cin>>n){
if(n==0){
break;
}
vector<block> blocks;
int x,y,z;
rep(i,1,n){
cin>>x>>y>>z;
blocks.push_back({x,y,z});
blocks.push_back({x,z,y});
blocks.push_back({y,x,z});
blocks.push_back({y,z,x});
blocks.push_back({z,x,y});
blocks.push_back({z,y,x});
}
solve(blocks);
}
return 0;
}

浙公网安备 33010602011771号