杭电1160

FatMouse's Speed

题意:找出最长一个最长的序列来反驳“老鼠越大只越跑得快”,要求一个最长的体重递增,速度递减的子序列。

Analyse:找最长子序列,先把老鼠按体重递增排列,然后分析每只老鼠放在序列最后时可以得到的最长子序列dp[i](因为子序列能否每增加一只老鼠的决定因素,是最后一只老鼠的数据),dp[i]=max(dp[j]+1(第j只老鼠的速度要小于第i只))(j<i),再在这些子序列里比较找出最长的子序列就OK。

View Code
 1 #include<stdio.h>
 2 struct Mouse
 3 {
 4     int w;
 5     int s;
 6     int num;
 7 };
 8 struct Dp
 9 {
10     int max;
11     int last;
12 };
13 int main()
14 {
15     int seq[1005];
16     struct Mouse mice[1005],temp;
17     struct Dp dp[1005];
18     int i,j,counter,min,max;
19     for(counter=0;scanf("%d%d",&mice[counter].w,&mice[counter].s)==2;mice[counter++].num=counter+1);
20     //sort according to increasing weight
21     for(i=0;i<counter-1;i++)
22     {
23         min=i;
24         for(j=min+1;j<counter;j++)
25         {
26             if(mice[min].w>mice[j].w)
27                 min=j;
28         }
29         //swap
30         temp=mice[min];
31         mice[min]=mice[i];
32         mice[i]=temp;
33     }
34     for(i=0;i<counter;i++)
35     {
36         dp[i].last=-1;
37         dp[i].max=1;
38         for(j=0;j<i;j++)
39         {
40             if(mice[j].s>mice[i].s && dp[j].max+1>dp[i].max)
41             {
42                 dp[i].max=dp[j].max+1;
43                 dp[i].last=j;
44             }
45         }
46     }
47     max=0;
48     for(i=1;i<counter;i++)
49     {
50         if(dp[max].max<dp[i].max)
51             max=i;
52     }
53     printf("%d\n",dp[max].max);
54     j=0;
55     for(i=max;i!=-1;i=dp[i].last)
56         seq[j++]=mice[i].num;
57     for(i=j-1;i>=0;i--)
58         printf("%d\n",seq[i]);
59     return 0;
60 }
posted @ 2012-07-13 16:47  Hogg  阅读(289)  评论(0)    收藏  举报