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 }

 

你可能感兴趣的:(HDU)