uva10051 - Tower of Cubes( 简单动归)

来源:互联网 发布:oracle性能监控软件 编辑:程序博客网 时间:2024/05/17 21:39

状态:d[i][j]表示第i个立方体第j个面朝上时塔的最大高度。

状态转移:dp[i][j] = max{dp[k][l]]+1|a[i][j^1]==a[k][l]};

输出路径用一个next数组记录下就可以了。

代码如下:

#include <cstdio>#include <cstring>#define N 505char ans[6][10] = {"front", "back", "left", "right", "top", "bottom"};int n, a[N][6], next[N][6][2], d[N][6], flag;void print_ans(int x, int y, int cur){    if(cur==0) return;    printf("%d %s\n", x, ans[y]);    print_ans(next[x][y][0],next[x][y][1],cur-1);}int main (){    int cas = 0;    while(scanf("%d",&n),n)    {        for(int i = 1; i <= n; i++) for(int j = 0; j < 6; j++) scanf("%d",&a[i][j]);        for(int i = 0; i < 6; i++) d[n][i] = 1;        int maxi, maxj, max = 1;        for(int i = n-1; i >=1 ; i--)        {            for(int j = 0; j < 6; j++)            {                int &ans = d[i][j];                int ansi, ansj;                ans = 1;                for(int k = n; k > i; k--)                    for(int l = 0; l < 6; l++)                    if(a[i][j^1]==a[k][l]&&ans<d[k][l]+1)                    {                        ans = d[k][l]+1;                        ansi = k; ansj = l;                    }                next[i][j][0] = ansi; next[i][j][1] = ansj;                if(max<d[i][j])                {                    max = d[i][j];                    maxi = i; maxj = j;                }            }        }        flag = max;        if(cas) printf("\n");        printf("Case #%d\n%d\n",++cas,max);        print_ans(maxi,maxj,max);    }    return 0;}