103

不得不说。这是今天A的最爽的一道题了。以前看这题时候感觉维数一多就处理不好,这次写完直接出样例,交上直接AC,这种感觉真爽。
具体思路类似n2的最长上升子序列,只不过要把每个都先排好序。
//============================================================================
// Name        : 103.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;


int n, k, t, ans, nowi;
int out[1000], d[1000], next[1000];
struct SEQ{
	int num;
	int s[1000];
}seq[1000];

bool cmp(SEQ a, SEQ b){
	return a.s[k] <= b.s[k];
}
int compare(SEQ a, SEQ b)
{
	for(int i = 1;i <= k;i++){
		if(a.s[i] <= b.s[i]) return -1;
	}
	return 1;
}


int main() {
	while(scanf("%d%d", &n, &k)!=EOF){
		for(int i = 1;i <= n;i++){
			d[i] = 1;
			next[i] = i;
			seq[i].num = i;
			for(int j = 1;j <= k;j++){
				scanf("%d", &seq[i].s[j]);
			}
			sort(seq[i].s+1, seq[i].s+k+1);
		}
		sort(seq+1, seq+n+1, cmp);
		for(int i = 1;i <= n;i++){
			for(int j = 1;j < i;j++){
				if(compare(seq[i], seq[j]) > 0&& d[i] < d[j]+1){
					d[i] = d[j]+1;
					next[i] = j;
				}
			}
		}
		ans = 1;
		for(int i = 1;i <= n;i++){
			if(ans < d[i]){
				ans = d[i];
				nowi = i;
			}
		}
		printf("%d\n", ans);
		for(int i = 1;i <= ans;i++){
			out[i] = seq[nowi].num;
			nowi = next[nowi];
		}
		for(int i = ans;i >= 1;i--){
			if(i == 1) printf("%d\n", out[i]);
			else printf("%d ", out[i]);
		}
	}
	return 0;
}
posted @ 2011-05-25 21:50  KOKO's  阅读(145)  评论(0编辑  收藏  举报