您的位置:首页 > 其它

uva10051(最长上升子序列 + 路径打印)

2014-11-01 13:27 357 查看
题目的意思就是有很多歌立方体,每个立方体六个面都涂有颜色.

要把他们叠起来.要求是序号小的在上面 ,并且一个立方体要叠在一个上面,必须相接的那个面颜色相同..

做法就是把一个立方体,当做6个存起来.然后找最长上升子序列..

并递归打印路径.

#include<stdio.h>
#include<string.h>
const int N = 505;
struct cube {
int t,b;
int w;
}cu[6 * N];
int f[6 * N];
int link[6 * N];
int num;
char dis[6][7] = {"front" , "back" ,"left" , "right" , "top","bottom" };
void print(int pos) {
int dir = pos % 6 ;
int n = pos / 6 + 1;
if (f[pos] == 1) {
printf("%d %s\n",n ,dis[dir]);
return ;
}
print(link[pos]);
printf("%d %s\n" ,n ,dis[dir]);
}
int main () {
int t ;
int cas = 1;
bool first = true;
while (scanf("%d",&t) && t) {
if(!first) {
printf("\n");
}
else {
first = false;
}
num = 0;
int a,b;
for (int i = 1 ; i <=t  ;i++) {
for (int j = 0 ; j < 3 ;j++) {
scanf("%d%d",&a,&b);
cu[num].b = b;
cu[num].t = a;
cu[num++].w = i;
cu[num].b = a;
cu[num].t = b;
cu[num++].w = i;
}
}
int m = 0;
int res;
memset(link , 0 ,sizeof(link));
for (int i = 0 ; i < num ;i++) {
f[i] = 1;
for (int j = 0 ; j < i ;j++) {
if (cu[i].t == cu[j].b && cu[i].w > cu[j].w && f[j] + 1 > f[i]) {
f[i] = f[j] + 1;
link[i] = j;
}
}
if (f[i] > m) {
m = f[i];
res = i;
}
}
printf("Case #%d\n",cas++);
printf("%d\n",m);
print(res);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: