FatMouse's Speed HDU - 1160 最长上升序列, 线性DP
#include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; struct node { int w, s; int index; //储存标号 } mouse[1005]; //小鼠的信息 //先体重,后速度 bool cmp(node a,node b) { if(a.w==b.w) return a.s<b.s; return a.w<b.w; } int main() { int dp[1005],load[1005],ans[1005]; int i, maxl,maxi,n,temp,x; i=1; while(scanf("%d%d",&mouse[i].w,&mouse[i].s)!= EOF) { mouse[i].index=i; dp[i]=1; load[i]=0; i++; } sort(mouse+1,mouse+i,cmp); //总数量 n=i-1; maxl=0; for(int i=2;i<=n;i++) { for(int j=1;j<i;j++) if(mouse[i].w>mouse[j].w&&mouse[i].s<mouse[j].s&&dp[i]<dp[j]+1) { //如果i的体重比j的小,而且速度j的大,并且还得j的最长子序列加一要大于目前i的最长子序列 dp[i] = dp[j] + 1; load[i] = j; } if(dp[i]>maxl) { //最长序列 maxl = dp[i]; //序列最后一个 maxi = i; } } temp=maxi; x=0; //将最终的结果标号存入数组中 while(temp!=0) { ans[x]=temp; temp=load[temp]; x++; } printf("%d\n", maxl); for(int i=maxl-1;i>= 0;i--)//标号存的时候是倒序,所以要给它反过来 printf("%d\n",mouse[ans[i]].index); return 0; }