UVA_10051

    将一个立方体拆成6个,然后去求最长上升子序列即可。

#include<stdio.h>
#include<string.h>
#define MAXD 3010
char b[][10] = {"front", "back", "left", "right", "top", "bottom"};
int N, w[MAXD], f[MAXD], upcol[MAXD], downcol[MAXD], d[MAXD], p[MAXD], a[10];
int init()
{
int i, j, k, e;
scanf("%d", &N);
if(!N)
return 0;
e = 0;
for(i = 0; i < N; i ++)
{
for(j = 0; j < 6; j ++)
scanf("%d", &a[j]);
for(j = 0; j < 6; j ++)
{
d[e] = j;
w[e] = i;
downcol[e] = a[j];
upcol[e] = a[j ^ 1];
e ++;
}
}
N = e;
return 1;
}
void printpath(int k)
{
if(p[k] != -1)
printpath(p[k]);
printf("%d %s\n", w[k] + 1, b[d[k]]);
}
void solve()
{
int i, j, k, max;
for(i = 0; i < N; i ++)
f[i] = 1;
memset(p, -1, sizeof(p));
for(i = 1; i < N; i ++)
for(j = 0; j < i; j ++)
if(w[j] < w[i] && upcol[j] == downcol[i] && f[j] + 1 > f[i])
{
f[i] = f[j] + 1;
p[i] = j;
}
max = 0;
for(i = 0; i < N; i ++)
if(f[i] > max)
{
max = f[i];
k = i;
}
printf("%d\n", f[k]);
printpath(k);
}
int main()
{
int t = 0;
while(init())
{
if(t ++)
printf("\n");
printf("Case #%d\n", t);
solve();
}
return 0;
}


posted on 2011-11-25 21:06  Staginner  阅读(361)  评论(0编辑  收藏  举报