标签:dp
刚开始输入写错了,最后还会接收一次值的
这道题如果只有一个维度,那么直接排序之后顺序输出就行了,但这里有二维,排序之后有一些点不能同时选,就需要决择了
先将所有老鼠按我们需要的大小关系排个序,然后就相当于求个最长上升子序列了
像这种第i个状态的值会和前面某数是什么有关系的,直接把前面的扫描一遍取最值就好了
感觉做dp的题,有两点很重要
一个是状态方程,这是解题的关键
还有一个就是状态初始化,这是保证不会WA的关键
#include<stdio.h> #include<string> #include<math.h> #include<algorithm> const int inf=999999; using namespace std; int dp[1005];//第i个数的最长递增子序列长度的最大值 struct Mice{ int w,s,pre,p; Mice(){ } }a[1005]; int cmp(Mice a,Mice b) { if(a.w!=b.w) return a.w<b.w; else return a.s>b.s; } void output(int post){ if(a[post].pre==-1){ printf("%d\n",a[post].p); return; } output(a[post].pre); printf("%d\n",a[post].p); } int main(){ #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif int n=1; a[0].w=0;a[0].s=inf; while(scanf("%d%d",&a[n].w,&a[n].s)!=EOF) n++; n--;//最后接收了一次空值 for(int i=1;i<=n;i++) a[i].p=i; sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++) dp[i]=1; for(int i=1;i<=n;i++) a[i].pre=-1; for(int i=2;i<=n;i++){ for(int j=1;j<i;j++){ if(a[j].w<a[i].w&&a[j].s>a[i].s){ if(dp[j]+1>dp[i]) { dp[i]=dp[j]+1; a[i].pre=j; } } } } //for(int i=1;i<=n;i++) printf("%d %d\n",a[i].w,a[i].s); int ma=0,post; for(int i=1;i<=n;i++){ if(dp[i]>ma){ ma=dp[i]; post=i; } } printf("%d\n",dp[post]); output(post); }
标签:dp
原文地址:http://blog.csdn.net/lj94093/article/details/45342607