动态规划(DP),类似LIS,FatMouse's Speed

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1108

解题报告:

1、首先按照weight从小到大排列,weight相同的按照speed从大到小排列;

2、Count[i]表示到第i个老鼠时,所求的最长“速度递减”子序列的长度;

3、path[i]=j是题目的关键,记录在Count[i]=Count[j]时,即最长“速度递减”子序列最后一个老鼠的前一只老鼠的位置

4、递归输出id

void output(int path[],pos)
{
    if(pos==0) return ;
    output(path,path[pos]);
    printf("%d\n",mice[pos].id);
}

Sources Code:

#include <cstdio>
#include <stdlib.h>
#include <algorithm>
#define INF 0x3f3f3f3f

using namespace std;

int n;///n只老鼠
int Count[1001]= {0}; ///count[i]表示构造到第i个老鼠时,序列的最大长度
int path[1001]= {0}; ///path[i]表示构造到第i个老鼠时的前一个老鼠(前驱)

struct mouse
{
    int weight;
    int speed;
    int id;
} mice[1001];

int cmp(const void *a,const void *b)
{
    struct mouse *p1=(mouse *)a;
    struct mouse *p2=(mouse *)b;
    if(p1->weight==p2->weight)
    {
        if(p1->speed>p2->speed)
            return p2->speed-p1->speed;
        else return p1->speed-p2->speed;
    }
    else return p1->weight-p2->weight;
}

void output(int path[],int pos)
{
    if(pos==0) return ;
    output(path,path[pos]);
    printf("%d\n",mice[pos].id);
}

int main()
{
    n=0;
    int i=0,j=0;
    while(scanf("%d%d",&mice[++i].weight,&mice[++j].speed)!=EOF)
    {
        n++;
        mice[n].id=n;
    }
    qsort(mice+1,n,sizeof(mice[0]),cmp);
    Count[1]=1;
    for(int i=2; i<=n; i++)
    {
        for(int j=1; j<i; j++)
        {
            if(mice[i].weight>mice[j].weight&&mice[i].speed<mice[j].speed)
            {
                if(Count[i]<Count[j])
                {
                    Count[i]=Count[j];
                    path[i]=j;
                }
            }
        }
        Count[i]++;
    }
    int _max=0;
    int pos;
    for(int i=1; i<=n; i++)
    {
        if(Count[i]>_max)
        {
            _max=Count[i];
            pos=i;
        }
    }
    printf("%d\n",_max);
    output(path,pos);
}

动态规划(DP),类似LIS,FatMouse's Speed

时间: 2024-10-08 16:01:49

动态规划(DP),类似LIS,FatMouse's Speed的相关文章

FatMouse&#39;s Speed hdu 1160(动态规划,最长上升子序列+记录路径)

http://acm.hdu.edu.cn/showproblem.php?pid=1160 题意:现给出老鼠的体重与速度,要求你找出符合要求的最长子序列.       要求是 W[m[1]] < W[m[2]] < ... < W[m[n]](体重) && S[m[1]] > S[m[2]] > ... > S[m[n]] (速度) 分析:有两个变量的话比较不好控制,自然需要先排序.再仔细思考的话,觉得和之前做的防御导弹有点类似,都是求最多能有几个符合

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

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

LIS [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): 9448    Accepted Submission(s): 4205 Special Judge Problem Description FatMouse believes that the fatter a mouse is, the faster

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 题意:给定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 FatMouse&#39;s Speed (LIS)

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

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): 24573    Accepted Submission(s): 10896Special Judge Problem Description FatMouse believes that the fatter a mouse is, the faster

[FatMouse&#39;s Speed] LIS

Description HDU-1160 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 incr

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