uva 10131
DP 先对大象体重排序 然后寻找智力的最长升序子列 输出路径....
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #define inf 0x7fffffff using namespace std; typedef struct { int w,s,num; } elem; bool cmp(elem a, elem b) { return a.w > b.w; } elem tel[1010]; int q = 0; int g[1010],d[1010],pre[1010],lu[1010]; void backtrack(int index) { if (pre[index] != -1) backtrack(pre[index]); lu[q++] = tel[index].num + 1; } int dd(int c) { d[0] = 1; int di,m,ans = 0; for(int i = 1; i < c; i++) { m = 0; for(int j = 0; j < i; j++) { if(d[j] > m && tel[j].s < tel[i].s && tel[j].w > tel[i].w) { m = d[j]; pre[i] = j; } } d[i] = m + 1; if(d[i] > ans) { ans = d[i]; di = i; } } printf("%d\n",ans); backtrack(di); for(int i = q-1; i >= 0; i--) printf("%d\n",lu[i]); return ans; } int main() { int n = 0; q = 0; memset(d, 0, sizeof(d)); memset(lu, 0, sizeof(lu)); memset(pre, -1, sizeof(pre)); while(scanf("%d%d",&tel[n].w,&tel[n].s) == 2) { tel[n].num = n; n++; } sort(tel, tel+n, cmp); // for(int i = 1; i <= n; i++) // g[i] = inf; // int ans = 0; // int q = 0; // for(int i = 0; i < n; i++) // { // int k = lower_bound(g+1, g+n+1, tel[i].s-1) - g; // //printf("%d\n",k); // d[i] = k; // g[k] = tel[i].s; // if(d[i] > ans) // { // ans = d[i]; // pre[q++] = i; // //printf("%d\n",i); // } // } // printf("%d\n",ans); // for(int i = q-1; i >= 0; i--) // printf("%d\n",tel[pre[i]].num+1); dd(n); return 0; }