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

题目大意:输入数据直到文件结束,每行两个数据 体重M 和 速度V,将其排列得到一个序列,要求为:体重越大 速度越低(相等则不符合条件)。求这种序列最长的长度,并输出路径。答案不唯一,输出任意一种就好了。

题目思路:这是个最长上升子序列的问题,我们按W的升序进行排序,若W相等则按V的降序排序。用Pre[]记录当前点的前驱节点,Last记录序列最后一个点,maxn记录最长长度,完成动规后可根据Last和Pre[]输出路径。

#include<cstdio>
#include<stdio.h>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#define INF 0x3f3f3f3f
#define MAX 1000005

using namespace std;

int dp[MAX],pre[MAX],ans[MAX];//pre[]数组记录当前点的前驱节点

struct node
{
    int w,v,id;//为防止排序后老鼠的编号丢失,所以用id记录下来
}a[MAX];

bool cmp(node A,node B)
{
    if(A.w!=B.w)
        return A.w<B.w;//按体重升序排列
    return A.v>B.v;//若体重相同则按速度降序排列
}

int main()
{
    int n,i,j,cnt=1,maxn=1,last=1;
    while(scanf("%d%d",&a[cnt].w,&a[cnt].v)!=EOF)
    {
        a[cnt].id=cnt;
        cnt++;
    }
    sort(a+1,a+cnt,cmp);
    for(i=1; i<MAX; i++)
        pre[i]=i;//初始化每个点的前驱节点为自己
    for(i=0; i<MAX; i++)
        dp[i]=1;//最短的序列只包含自己,长度为一
    for(i=1; i<cnt; i++)
    {
        for(j=1; j<=i; j++)
        {
            if(a[i].w>a[j].w && a[i].v<a[j].v)
            {
                if(dp[i] < dp[j]+1)
                {
                    dp[i]=dp[j]+1;
                    pre[a[i].id]=a[j].id;//记录当前点的前驱节点
                }
            }
            if(maxn < dp[i])
            {
                last=a[i].id;//更新最后一个节点
                maxn=dp[i];
            }
        }
    }

    printf("%d\n",maxn);

    for(i=maxn;i>=1;i--)
    {
        ans[i]=last;
        last=pre[last];
    }//将pre[]倒着记录到ans[]里面

    for(i=1;i<=maxn;i++)
        printf("%d\n",ans[i]);
    return 0;
}

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

时间: 2024-08-26 00:58:03

HDU 1160 FatMouse's Speed 动态规划 记录路径的最长上升子序列变形的相关文章

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 (最长上升子序列+记录路径)

题目链接:HDU 1160 FatMouse's Speed 题意:求体重越重,反而速度越慢的例子,并输出对应的编号. 对speed进行从大到小排序,再求weight的最长上升序列,并输出路径. AC代码: #include<stdio.h> #include<algorithm> #include<stack> using namespace std; struct Node { int weight; int speed; int id; }; struct Nod

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

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

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

[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

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 (动规+最长递减子序列)

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