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 }