uva437 - The Tower of Babylon(动规,记忆化搜索)

状态:dp[i]表示以编号i的砖作为当前状态最下层的塔能达到的最大高度。

状态转移:dp[i] = max(dp[j]+h[j]|j号砖的底座必须小于i的底座)

代码如下;

#include <cstdio>
#include <cstring>
#define N 100
int m, n, d[N], x[N], y[N], z[N];
int dp(int k)
{
    int& ans = d[k];
    if(ans>0) return ans;
    ans = z[k];
    for(int i = 0; i < n; i++)
    {
        if((x[i]<x[k]&&y[i]<y[k])||(x[i]<y[k]&&y[i]<x[k]))
        ans = ans>dp(i)+z[k]?ans:dp(i)+z[k];
    }
    return ans;
}
int main ()
{
    int t = 0;
    while(scanf("%d",&m), m)
    {
        n = 0;
        for(int i = 0; i < m; i++)
        {
            scanf("%d %d %d",&x[n],&y[n],&z[n]);
            n++;
            x[n] = x[n-1]; y[n] = z[n-1]; z[n] = y[n-1];
            n++;
            x[n] = y[n-2]; y[n] = z[n-2]; z[n] = x[n-2];
            n++;
        }
        memset(d,0,sizeof(d));
        int ans = 0;
        for(int i = 0; i < n; i++)
        ans = ans>dp(i)?ans:dp(i);
        printf("Case %d: maximum height = %d\n",++t, ans);
    }
    return 0;
}


 

你可能感兴趣的:(uva437 - The Tower of Babylon(动规,记忆化搜索))