标签:
http://acm.hdu.edu.cn/showproblem.php?pid=1160
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 12338 Accepted Submission(s): 5405
Special Judge
#include<iostream> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; #define N 10005 #define oo 0x3f3f3f3f /** 感觉有点用导弹防御的思想 每次记录从 0 到 i 的最长个数 并用 pre[i] 记录 i 点是从哪个点过来的 **/ /// number 是记录它原来的位置 struct node { int w, s, number; }a[N]; /// pre[] 是个很好的记录方式,可以记录它的是从哪个过来的(它的上一步) int dp[N], pre[N]; /// 先按 w 从小到大排, 再按 s 从大到小排 int cmp(node n1, node n2) { if(n1.w!=n2.w) return n1.w < n2.w; return n1.s > n2.s; } int main() { int i=1, j, n; memset(a, 0, sizeof(a)); memset(dp, 0, sizeof(dp)); while(scanf("%d%d", &a[i].w, &a[i].s)!=EOF) { a[i].number = i; i++; } n=i; sort(a+1, a+i+1, cmp); /** for(i=1; i<n; i++) printf("%d %d %d\n", a[i].number, a[i].w, a[i].s); **/ for(i=1; i<n; i++) { pre[i] = i; dp[i] = 1; for(j=1; j<i; j++) { if(a[i].w!=a[j].w && a[i].s<a[j].s) { if(dp[i]<dp[j]+1) { pre[i] = j; dp[i] = dp[j] + 1; } } } } int Max=-oo, index=0; for(i=1; i<n; i++) { if(dp[i]>Max) { Max = dp[i]; index = i; } } printf("%d\n", Max); i=0; int b[N]={0}; while(pre[index]!=index) { b[i++] = a[index].number; index = pre[index]; } printf("%d\n", a[index].number); for(j=i-1; j>=0; j--) printf("%d\n", b[j]); return 0; }
(最长上升子序列 并记录过程)FatMouse's Speed -- hdu -- 1160
标签:
原文地址:http://www.cnblogs.com/YY56/p/4864945.html