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