uva 103 Stacking Boxes

LIS有点小改动,比较的时候必须完全大于
#include<stdio.h>
#include
<stdlib.h>

const int M=31;

int num[M][M], path[M], index[M];
int n, m, len;

int cmpnum(const void *a, const void *b)
{
    
return *(int *)a-*(int *)b;
}

int cmpindex(const void *a, const void *b)
{
    
return num[*(int *)a][0- num[*(int *)b][0];
}

void print(int k, int lens)
{
    
if ( k < 0 || !len ) return;
    print(path[k], len
-1);
    printf(
"%d", k+1);
    len 
== lens ? putchar(10) : putchar(' ');
}

int judge(int j, int k)
{
    
for ( int i = 0 ; i < m ; i++ )
        
if ( num[j][i] <= num[k][i] )
            
return 0;
    
return 1;
}

int main()
{
    
while2 == scanf("%d%d"&n, &m) )
    {
        
int dp[M], i, j;
        
for ( i = 0 ; i < n ; i++ )
        {
            index[i]
= i; dp[i]= 1 ; path[i]= -1;
            
for ( j = 0 ; j < m ; j++ )
                scanf(
"%d", num[i]+j);
            qsort(num[i], m, 
sizeof(int), cmpnum);
        }
        qsort(index, n, 
sizeof(int), cmpindex);
        
int k= 0;
        len
= 1;
        
for ( i = 1 ; i < n ; i++ )
        {
            
for ( j = 0 ; j < i ; j++ )
            {
                
if ( judge(index[i], index[j]) && dp[i] < dp[j]+1 )
                {
                    dp[i]
= dp[j]+1;
                    path[index[i]]
=index[j];
                }
            }
            
if (dp[i] > len)
            {
                len
= dp[i];
                k
= index[i];
            }
        }
        printf(
"%d\n", len);
        print(k, len);
    }
    
return 0;
}

posted on 2011-09-09 18:23 purplest 阅读(209) 评论(0)  编辑 收藏 引用 所属分类: DP


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年9月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

常用链接

留言簿

随笔分类(70)

随笔档案(68)

ACMer

搜索

最新随笔

最新评论