HDU-1069モンキーアンドバナナ(ダイナミックプログラミング)

元の質問へのリンク; 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;
}


おすすめ

転載: blog.csdn.net/hzf0701/article/details/108987515