点击打开链接
题目大意是找到一个最多的老鼠序列,使得序列中的老鼠的体重满足递增,相应老鼠的速度满足递减。
思路:就是先按体重递增进行sort排序,然后按照体重找到最长递减子序列即可,用动态规划做比较简单。
态dp[i]表示前i个老鼠中的最长递减子序列长度,状态转移方程为dp[i] = max{dp[ j ]} + 1, 最后找出最大的dp[i]即可。最后的路径用栈输出就可
#include<bits/stdc++.h> using namespace std; struct node { int x,y,num; }p[100000]; bool cmp(node p1,node p2) { return p1.x==p2.x?p1.y>p2.y:p1.x<p2.x; } int dp[100000]; int path[100000]; int main() { int n=0; memset(path,-1,sizeof(path)); while(~scanf("%d%d",&p[n].x,&p[n].y)) { p[n++].num=n; // if(n>=9) // break; } sort(p,p+n,cmp); // for(int i=0;i<n;i++) // printf("%d\n",p[i].x); int Maxdp=0,flag=0; for(int i=0;i<n;i++) { dp[i]=1; for(int j=i-1;j>=0;j--) { if(p[j].y>p[i].y&&p[j].x<p[i].x&&dp[i]<dp[j]+1) { dp[i]=dp[j]+1; path[i]=j; } } if(Maxdp<dp[i]) { Maxdp=dp[i]; flag=i; } } printf("%d\n",Maxdp); stack<int>Q; for(int i=flag;i!=-1;i=path[i]) { Q.push(p[i].num); } while(!Q.empty()) {printf("%d\n",Q.top()); Q.pop(); } return 0; }