Problem descriptioin: http://uva.onlinejudge.org/external/1/103.html
采用动态规划记忆化搜索(隐式图)实现
/* * 103.cc * * Created on: Dec 27, 2012 * Author: guixl */ #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int MAX = 50; int n, d; int v[MAX][10]; int graph[MAX][MAX]; int visit[MAX]; int length[MAX]; int pre[MAX]; int Search(int node) { if(visit[node]) return length[node]; int value = 1; for (int i=0; i<n; i++) { if (graph[node][i]) { int tmp = Search(i) + 1; if (tmp > value) { value = tmp; pre[node] = i; } } } length[node] = value; visit[node] = 1; return value; } int main(int argc, char** argv) { while (scanf("%d%d", &n, &d) != EOF) { for (int i=0; i<n; i++) for (int j=0; j<d; j++) { scanf("%d", &v[i][j]); } for (int i=0; i<n; i++) { sort(v[i], v[i] + d); } memset(graph, 0, sizeof(graph)); for (int i=0; i<n; i++) for (int j=0; j<n; j++) if (i != j) { bool nested = true; for (int k=0; k<d; k++) if (v[i][k] >= v[j][k]) { nested = false; break; } if (nested) graph[i][j] = 1; } //init result store arrays for (int i=0; i<n; i++) length[i] = 1; memset(visit, 0, sizeof(visit)); for (int i=0; i<n; i++) { Search(i); } int value = 1; int start = -1; for (int i=0; i<n; i++) { if (length[i] > value) { value = length[i]; start = i; } } printf("%d\n", value); for (int i=0; i<value; i++) { printf("%d ", start+1); start = pre[start]; } printf("\n"); } return 0; }