hdu 1160 FatMouse's Speed(dp)

http://acm.hdu.edu.cn/showproblem.php?pid=1160

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
struct Node
{
    int w,s,id,fa;
};
Node mice[1000+10];
int dp[1000+10];

int cmp(Node a,Node b)
{
    return a.w<b.w;
}

int main()
{
    int i,j,k;
    int cnt=1;
    int t1,t2;
    int ans,ansn;
    while(scanf("%d%d",&t1,&t2)!=EOF)
    {
        if(t1==-1) break;
        mice[cnt].w=t1;
        mice[cnt].s=t2;
        mice[cnt].id=cnt;
        cnt++;
    }
    sort(mice+1,mice+cnt,cmp);
    ans=mice[cnt-1].id;
    ansn=1;
    for(i=1;i<cnt;i++)
    {
        mice[i].fa=i;
        dp[i]=1;
    }
    for(i=cnt-2;i>=1;i--)
    {
        for(j=i+1;j<cnt;j++)
        {
            if(dp[j]+1>dp[i]&&mice[i].w<mice[j].w&&mice[i].s>mice[j].s)
            {
                dp[i]=dp[j]+1;
                mice[i].fa=j;
            }
        }
        if(dp[i]>ansn) {ans=i;ansn=dp[i];}
    }

    /*
    for(i=1;i<cnt;i++)
    {
        printf("%d %d %d %d\n",mice[i].w,mice[i].s,dp[i],mice[i].fa);
    }*/
    printf("%d\n",ansn);
    while(mice[ans].fa!=ans)
    {
        printf("%d\n",mice[ans].id);
        ans=mice[ans].fa;
    }
    printf("%d\n",mice[ans].id);
    return 0;
}

  

hdu 1160 FatMouse's Speed(dp)

时间: 2024-12-25 13:27:59

hdu 1160 FatMouse's Speed(dp)的相关文章

HDU 1160 FatMouse&#39;s Speed DP题解

本题就先排序老鼠的重量,然后查找老鼠的速度的最长递增子序列,不过因为需要按原来的标号输出,故此需要使用struct把三个信息打包起来. 查找最长递增子序列使用动态规划法,基本的一维动态规划法了. 记录路径:只需要记录后继标号,就可以逐个输出了. #include <stdio.h> #include <algorithm> using namespace std; const int MAX_N = 1005; struct MouseSpeed { int id, w, s; b

HDU - 1160 FatMouse&#39;s Speed(dp+路径记录)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160 题意:给定x组老鼠的重量(W)和速度(S).求使得   W[m[1]] < W[m[2]] < ... < W[m[n]]       S[m[1]] > S[m[2]] > ... > S[m[n]] 的最长序列长度和路径 题解:排序一下,然后LIS,路径记录一下,输出就可以了 1 #include <iostream> 2 #include <a

HDU 1160 FatMouse&#39;s Speed (sort + dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160 给你一些老鼠的体重和速度,问你最多需要几只可以证明体重越重速度越慢,并输出任意一组答案. 结构体按照体重从小到大排序,然后根据速度就是最长下降子序列. 1 //#pragma comment(linker, "/STACK:102400000, 102400000") 2 #include <algorithm> 3 #include <iostream> 4

[dp专题]hdu 1160 FatMouse&#39;s Speed

FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10172    Accepted Submission(s): 4521Special Judge Problem Description FatMouse believes that the fatter a mouse is, the faster i

HDU 1160 FatMouse&#39;s Speed 简单DP

FatMouse's Speed Problem Description FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to take the data on a collection of mice and put as large a subset of this data as possible into a sequence so that the

HDU 1160 FatMouse&#39;s Speed (最長單調子序列 dp)

鏈接: http://acm.hdu.edu.cn/showproblem.php?pid=1160 Problem Description FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to take the data on a collection of mice and put as large a subset of this data as pos

HDU 1160 FatMouse&#39;s Speed (动规+最长递减子序列)

FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9174    Accepted Submission(s): 4061 Special Judge Problem Description FatMouse believes that the fatter a mouse is, the faster

HDU 1160 FatMouse&#39;s Speed 动态规划 记录路径的最长上升子序列变形

题目大意:输入数据直到文件结束,每行两个数据 体重M 和 速度V,将其排列得到一个序列,要求为:体重越大 速度越低(相等则不符合条件).求这种序列最长的长度,并输出路径.答案不唯一,输出任意一种就好了. 题目思路:这是个最长上升子序列的问题,我们按W的升序进行排序,若W相等则按V的降序排序.用Pre[]记录当前点的前驱节点,Last记录序列最后一个点,maxn记录最长长度,完成动规后可根据Last和Pre[]输出路径. #include<cstdio> #include<stdio.h&

hdu 1160 FatMouse&#39;s Speed(最长不下降子序列+输出路径)

题意: FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to take the data on a collection of mice and put as large a subset of this data as possible into a sequence so that the weights are increasing, but the s