最长上升子序列,用记忆化搜索做的,比较慢。
代码如下:
#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; }