首页 > 其他 > 详细

HDU 1160 FatMouse's Speed

时间:2019-10-21 13:40:42      阅读:65      评论:0      收藏:0      [点我收藏+]

这题是动态规划,贪心和排序。

状态表示:d[i]表示前i位的最长满足要求子序列的长度。

状态转移:当重量严格大于前一只并且速度严格大于前一只的时候更新转移数组  d[i]=max(d[i],d[j]+1);

因为不仅要求输出最长的子序列的长度,还要求输出编号,就注意推理,为了减少时间复杂度把小老鼠的体重降序排列

 

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int d[N],p[N],cnt=0,ans;
struct node
{
    int w,s,num;
}a[N];
bool cmp(node x,node y)
{
    return x.w<y.w;
}
int main()
{
    while(~scanf("%d%d",&a[cnt].w,&a[cnt].s))  
    {
        d[++cnt]=1;
        a[cnt].num=cnt+1;
    } 
    ans=cnt;
    d[ans]=0;
    sort(a,a+cnt,cmp);
    memset(p,-1,sizeof(p));
    cnt-=1;
    for(int i=cnt;i>=0;i--)
        for(int j=cnt;j>i;j--)
        {
            if(d[j]+1>d[i]&&a[i].w<a[j].w&&a[i].s>a[j].s)
            {
                p[i]=j;    d[i]=d[j]+1;
                if(d[ans]<d[i])    ans=i;
            }
        }
    printf("%d\n",d[ans]);
    while(~ans)
    {
        printf("%d\n",a[ans].num);
        ans=p[ans];
    }
    return 0;
}

 

HDU 1160 FatMouse's Speed

原文:https://www.cnblogs.com/Siv0106/p/11712891.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!