生活随笔
收集整理的這篇文章主要介紹了
【UVA 437】The Tower of Babylon(记忆化搜索写法)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【題目鏈接】:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=378
【題意】
給你n個(gè)方形;
由3個(gè)屬性,長(zhǎng)寬高決定;
你可以任意擺放這個(gè)方形(即把哪一面朝下方);
然后每種方形都有無(wú)限個(gè);
一個(gè)方形能夠擺在另外一個(gè)方形上面,當(dāng)且僅當(dāng)這個(gè)方形的長(zhǎng)和寬都嚴(yán)格大于另外一個(gè)方形的長(zhǎng)和寬(即changi>changj && kuani>kuanj);
問你這n個(gè)方形最多能疊多高;
【題解】
把每個(gè)方形的3種擺法都取出來(lái);
(即取3個(gè)屬性中的某一個(gè)屬性出來(lái)作為高,另外兩個(gè)作為寬和長(zhǎng));
然后如果某一個(gè)方形x可以放到另外一個(gè)方形y的上面;
則連一條有向邊從x指向y;
然后問題就能轉(zhuǎn)化為一個(gè)有向無(wú)環(huán)圖上的最長(zhǎng)路了;
起點(diǎn)不一定
也即一條最長(zhǎng)鏈
寫個(gè)記憶化搜索就好;
f[x]=max(f[x],f[y]+h[x]),(x,y)∈E,h[x]為x的高
【Number Of WA】
1
【反思】
忘記初始化+忘記輸出Case
【完整代碼】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define Open() freopen("D:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0)typedef pair<
int,
int> pii;
typedef pair<LL,LL> pll;
const int dx[
9] = {
0,
1,-
1,
0,
0,-
1,-
1,
1,
1};
const int dy[
9] = {
0,
0,
0,-
1,
1,-
1,
1,-
1,
1};
const double pi =
acos(-
1.0);
const int N =
30;
struct abc{LL c,k,g;
};
int n,b[
4],nn;
LL dp[N*
3+
100];
abc a[N*
3+
100];
vector <int> G[N*
3+
100];LL dfs(
int x){
if (dp[x]!=-
1)
return dp[x];LL &ans = dp[x];ans = a[x].g;
int len = G[x].size();rep1(i,
0,len-
1){
int y = G[x][i];ans = max(ans,dfs(y) + a[x].g);}
return dp[x];
}
int main()
{
int kk =
0;
while (~
scanf(
"%d",&n) && n){kk++;ms(dp,-
1);nn =
0;rep1(i,
1,N*
3) G[i].clear();rep1(i,
1,n){rep1(j,
1,
3)
scanf(
"%d",&b[j]);sort(b+
1,b+
1+
3);rep1(j,
1,
3){nn++;rep2(k,
3,
1)
if (k!=j){a[nn].c = b[k];
break;}rep1(k,
1,
3)
if (k!=j){a[nn].k = b[k];
break;}a[nn].g = b[j];}}n = nn;rep1(i,
1,n)rep1(j,
1,n)
if (a[i].c > a[j].c && a[i].k > a[j].k)G[i].pb(j);LL d =
0;rep1(i,
1,n)d = max(d,dfs(i));
printf(
"Case %d: maximum height = ",kk);
printf(
"%lld\n",d);}
return 0;
}
轉(zhuǎn)載于:https://www.cnblogs.com/AWCXV/p/7626212.html
總結(jié)
以上是生活随笔為你收集整理的【UVA 437】The Tower of Babylon(记忆化搜索写法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。