hdu 1160 FatMouse's Speed

来源:互联网 发布:mp4相册制作软件 编辑:程序博客网 时间:2024/06/08 20:15

题目大意就是求出两条件分别满足上升和下降的最长子序列。

解题思路:结构上套模板,细节上的区别有

1、想将一个条件排好序,相当于已经判别了一个条件;

2,、因为题目要求的是每个数在原序列的位置,所以需要在结构体中提前记录位置,以便于排序后仍能找到位置。另一点是在寻找最长子序列时,记录是由前面哪一个字符发展而来的,以便于能够知道各在排序后的位置。

#include <cstdio>#include<iostream>#include <cstring>#include<algorithm>using namespace std;const int maxn=1010;int dp[maxn],m,Max,b[maxn];struct mice{    int weight;    int speed;    int num;} a[maxn];bool cmp(mice a,mice b){    return a.weight<b.weight;}void out(int id){    if(b[id]!=id)        out(b[id]);    cout<<a[id].num<<endl;}void LICS(){    memset(dp,0,sizeof(dp));    for(int i=0; i<m; i++)    {        dp[i]=1;        b[i]=i;        for(int j=0; j<i; j++)            if(a[i].speed<a[j].speed&&a[i].weight>a[j].weight && dp[i]<dp[j]+1)    //条件多判断一个重量也不相等            {                b[i]=j;                dp[i]=dp[j]+1;                //记录该位置最长的情况下,前一个字符的位置            }    }    Max=0;    int id;    for(int i=0; i<m; i++)        if(Max<=dp[i])          //这里很坑,是<=,而不是<            {Max=dp[i];id=i;}  //寻找子序列长度和最后一个字符的位置    cout<<Max<<endl;    out(id);                   //递归输出}int main(){    int i=0;    while(scanf("%d%d",&a[i].weight,&a[i].speed)!=EOF)    {        i++;        a[i-1].num=i;    //记录该老鼠在原序列的位置    }    m=i;    sort(a,a+m,cmp);    LICS();    return 0;}


1 0
原创粉丝点击