元の質問へのリンク; http://acm.hdu.edu.cn/showproblem.php?pid = 1069
テストサンプル
サンプル入力
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
6 6 6
7 7 7
5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27
0
サンプル出力
ケース1:最大高さ= 40
ケース2:最大高さ= 21
ケース3:最大高さ= 28
ケース4:最大高さ= 342
質問:あなたにnnを与えるnブロック、各ブロックには長さ、幅、高さがあり(ブロックは任意の回転で配置できます)、ブロックの数は無制限です。次に、背の高いタワーを構築する必要があります。上部の正方形の長さと幅は、下部の正方形の長さと幅よりも厳密に小さくする必要があります。積み重ねることができる最大の高さを尋ねます。
問題解決のアイデア:このDPの質問を爆破してください、それはとても良いです、それは私が前にそれをしたときはされませんでした。今、それは最終的に解決することができます。四角が実際に持っているのでOK、我々は被写体に、我々は、四角が実際に回転させることができることを発見し、任意に配置されている6 66つの配置方法で、6つの正方形があると考えることができます。次に、この質問の鍵は、実際には、増加する正方形のシーケンスを見つけることです。高さを最大化します。したがって、正方形を並べ替える必要があります。指定された条件に応じて、長さを主要素、幅を副要素としてソートをカスタマイズできます。(ここでは、独自の演算子をオーバーロードするか、cmp関数を作成できます)。次に、状態を見つけます。dp[i] dp [i]を使用できます。d p [ i ]は、一番下のものがiiであることを示しますiブロックのタワーの最大高さ。その場合、この状態は前のi − 1i-1からのものでなければなりません私−1つの正方形によって決定されます。(言い換えれば、前のi − 1i-1から私−1つの立方体が積み上げられました。)転送プロセス全体を通して、最終的な状態がないため、maxxmaxxを使用する必要がありますM A X X変数最大実メモリ。すべての正方形をトラバースするmaxxmaxxM A X Xは、この最後の結果です。特にコードを見てください。
ACコード
/*
*邮箱:[email protected]
*blog:https://me.csdn.net/hzf0701
*注:文章若有任何问题请私信我或评论区留言,谢谢支持。
*
*/
#include<bits/stdc++.h> //POJ不支持
#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define fi first
#define se second
#define mp make_pair
using namespace std;
const int inf = 0x3f3f3f3f;//无穷大
const int maxn = 1e5;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
//*******************************分割线,以上为自定义代码模板***************************************//
int n;
struct node{
int l,w,h;
bool operator <(const node &a){
if(l==a.l)return w<a.w;
return l<a.l;
}
};
int dp[300];
int main(){
//freopen("in.txt", "r", stdin);//提交的时候要注释掉
IOS;
int cnt=1;
while(cin>>n&&n){
int x,y,z;
vector<node> blocks;
rep(i,0,n-1){
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});
}
sort(blocks.begin(),blocks.end());
int len=blocks.size();
int maxx=0;
rep(i,0,len-1){
dp[i]=blocks[i].h;
rep(j,0,i-1){
if(blocks[i].l>blocks[j].l&&blocks[i].w>blocks[j].w){
dp[i]=max(dp[i],dp[j]+blocks[i].h);
}
}
maxx=max(dp[i],maxx);//保存最大值。
}
cout<<"Case "<<cnt++<<": maximum height = "<<maxx<<endl;
}
return 0;
}