杭电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 }


浙公网安备 33010602011771号