HDU - 1160 (FatMouse's Speed )最长上升子序列
题意:一个元素有两个属性 w 和 sp 求在w严格递增的情况下 sp严格递减
用结构体 定义三个参数 w sp ix , ix是在输入时的顺序 因为我们要排序
之后把结构体数组 按从小到大排序 然后就是最长上升子序列了
代码如下
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 10100,INF = 0xfffffff; struct node{ int w,sp; int ix; }Node[maxn]; int cmp(node a,node b) { return a.w < b.w; } int main() { int w,sp,cnt = 0,path[maxn],dp[maxn],dis[maxn]; memset(dp,0,sizeof(dp)); memset(path,0,sizeof(path)); int n; while(cin>>w>>sp) { Node[cnt].ix = cnt+1; Node[cnt].w = w; Node[cnt++].sp = sp; } sort(Node,Node+cnt,cmp); for(int i=cnt-1; i>=0; --i) { for(int j=cnt-1; j>=i; --j) { if(Node[j].sp < Node[i].sp && Node[j].w > Node[i].w && dp[j] + 1 >= dp[i]) { dp[i] = dp[j] + 1; path[Node[i].ix] = Node[j].ix; } } } int maxx = -INF,index = 0; for(int i=0; i<cnt; i++) { if(maxx < dp[i]) { maxx = dp[i]; index = Node[i].ix; } } int ans = 0; while(index) { dis[ans++] = index; index = path[index]; } cout<<ans<<endl; for(int i=0; i<ans;i++) cout<<dis[i]<<endl; return 0; }
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。