现在的位置: 首页 > 综合 > 正文

UVa 103 – Stacking Boxes

2012年10月14日 ⁄ 综合 ⁄ 共 1010字 ⁄ 字号 评论关闭

最长上升子序列,用记忆化搜索做的,比较慢。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int num, ver, cct;
int dp[32], path[30][30];
int save[30], box[30][10];
bool G[31][31];
int cmp(const void *a, const void *b)
{
    return *(int*)a - *(int*)b;
}
bool Judge(int x, int y, int ver)
{
    for(int i=0; i<ver; ++i)
        if(box[x][i] >= box[y][i])
            return false;
    return true;
}
int d(int i)
{
    int &ans = dp[i];
    ans = 1;
    for(int j=0; j<num; ++j)
        if(G[i][j])
        {
            int dd = d(j) + 1;
            if(ans < dd)
                ans = dd;
        }
    return ans;
}
void print_ans(int i)
{
    save[cct++] = i + 1;
    for(int j=0; j<num; ++j)
        if( G[i][j] && (dp[i]==dp[j]+1) )
        {
            print_ans(j);
            break;
        }
}
int main()
{
    while(scanf("%d%d", &num, &ver) != EOF)
    {
        for(int i=0; i<num; ++i)
        {
            for(int j=0; j<ver; ++j)
                scanf("%d", &box[i][j]);
            qsort(&box[i], ver, sizeof(box[i][0]), cmp);
        }
        memset(G, false, sizeof(G));
        for(int i=0; i<num; ++i)
            for(int j=0; j<num; ++j)
                if((i!=j) && Judge(i, j, ver))
                {
                    G[i][j] = true;
                }
        memset(dp, 0, sizeof(dp));
        int Max = 0, imax;
        for(int i=0; i<num; ++i)
        {
            int ans = d(i);
            if(ans > Max)
            {
                Max = ans;
                imax = i;
            }
        }
        cct = 0;
        printf("%d\n", Max);
        print_ans(imax);
        printf("%d", save[0]);
        for(int i=1; i<cct; ++i)
            printf(" %d", save[i]);
        puts("");
    }
    return 0;
}

抱歉!评论已关闭.