zoukankan      html  css  js  c++  java
  • UVA 10051 Tower of Cubes

    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;
    }


  • 相关阅读:
    [背包]JZOJ 3232 【佛山市选2013】排列
    内核空间、用户空间、虚拟地址
    进程与线程的概念
    Python中字符串颜色
    socket编程
    模块与包
    常用模块
    面向对象进阶
    面向对象编程
    函数式编程
  • 原文地址:https://www.cnblogs.com/staginner/p/2263797.html
Copyright © 2011-2022 走看看