hdu1160FatMouse's Speed(DP)

http://acm.hdu.edu.cn/showproblem.php?pid=1160

1A 破题敲了一个多小时 最长上升子序列和最长下降子序列合起来 并把路径保留下来 题中是可以打乱顺序去找的 先按W上升或S下降排下序 再按最升和最降做

View Code
 1 #include <iostream>
 2 #include<cstdio>
 3 #include<string.h>
 4 #include<algorithm>
 5 using namespace std;
 6 struct node
 7 {
 8     int w,s,xu;
 9 }q[1011];
10 bool cmp(node a,node b)
11 {
12     return a.w<b.w;
13 }
14 int dp[1011],da[1011][1011];
15 int main()
16 {
17     int i = 0,j,k,n,m,g,x;
18     while(scanf("%d%d",&q[i].w,&q[i].s)!=EOF)
19     {
20         if(q[i].w==0)
21         break;
22         q[i].xu = i+1;
23         i++;
24     }
25     sort(q,q+i,cmp);
26     for(j = 0;  j <i ; j++)
27         da[j][1] = q[j].xu;
28     dp[0] = 1;
29     x = 0;
30     int max = 1;
31     for(j = 1 ; j < i ; j++)
32     {
33         int tmax = 1;
34         for(k = 0 ; k < j ; k++)
35         if(q[k].w<q[j].w&&q[k].s>q[j].s&&dp[k]+1>tmax)
36         {
37             tmax = dp[k]+1;
38             for(g = 1 ; g <= dp[k] ; g++)
39             da[j][g] = da[k][g];
40             da[j][tmax] = q[j].xu;
41         }
42         dp[j] = tmax;
43         if(tmax>max)
44         {
45             max = tmax;
46             x = j;
47         }
48     }
49     printf("%d\n",max);
50     for(i = 1 ; i <= max ; i++)
51     printf("%d\n",da[x][i]);
52     return 0;
53 }

 

posted @ 2012-09-05 20:06  _雨  阅读(251)  评论(0编辑  收藏  举报