FatMouse's Speed(HDU-1160)

一道经典的最长子序列题,不过该题需要维护两个量,体重和速度,所以需要先对一个量进行排序,然后剩下的那个量就可以像处理最长子序列那样做了。 值得一提的是该题需要打印路径,最好的方法是用一个数组pre运用类似链表的结构,来记录路径。 这恰恰就是紫书上数据结构那章例题14中所用的记录最短路路径的方法 。 其中的巧妙和实现细节请读者细细品味。

针对这道题, 由于dp是利用之前计算的结果进行递推得到的,因此,每一步的计算都要用到上一步的结。最长上升子序列,就是枚举当前序列的最后一位,然后从前面递推找最优解, 所以这里的pre[i] = j;意思就是当前这个最优解i是由上一个最优解j递推出来的。所以可以用这种方法求的最优路径。  我无意中还找到了一个bug, 大家可以尝试一下1 2这组数据,也就是所有老鼠的体重和速度都一样,有些能AC的代码显然输出的不正确,因为他们没有输出路径。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int dp[1005],pre[1005],ans[1005];
struct node{
    int w,s,id;
}a[1005];
bool cmp(node a,node b){
    return a.w<b.w||a.w==b.w&&a.s>b.s;
}
int main(){
    int cnt = 0;
    memset(pre,0,sizeof(pre));
    while(~scanf("%d%d",&a[cnt].w,&a[cnt].s)){ a[cnt].id=cnt+1; cnt++;}
    int res = 0;

    sort(a,a+cnt,cmp);
    int idex=0 ;
    for(int i=0;i<cnt;i++){
        dp[i] = 1;
        for(int j=0;j<i;j++) if(a[j].w<a[i].w&&a[j].s>a[i].s) {
            if(dp[i]<dp[j]+1) { pre[i] = j; dp[i] = dp[j] + 1; }
        }
        if(res<dp[i]){
            res = dp[i];
            idex = i;
        }
    }
    printf("%d\n",res);
    int kase=0;
    while(idex!=0) {
        ans[kase++] = idex;
        idex = pre[idex];
    }  if(res==1) printf("%d\n",dp[0]);
    while(kase>0){
        kase--;
        printf("%d\n",a[ans[kase]].id);
    }
    return 0;
}

FatMouse's Speed(HDU-1160)

时间: 2024-10-12 13:49:10

FatMouse's Speed(HDU-1160)的相关文章

(最长上升子序列 并记录过程)FatMouse&#39;s Speed -- hdu -- 1160

http://acm.hdu.edu.cn/showproblem.php?pid=1160 FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12338    Accepted Submission(s): 5405Special Judge Problem Description FatMouse be

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]] (速度) 分析:有两个变量的话比较不好控制,自然需要先排序.再仔细思考的话,觉得和之前做的防御导弹有点类似,都是求最多能有几个符合

FatMouse&#39;s Speed HDU - 1160 最长上升序列,

#include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; struct node { int w, s; int index; //储存标号 } mouse[1005]; //小鼠的信息 //先体重,后速度 bool cmp(node a,node b) { if(a.w==b.w) return a.s<b.s; retu

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 #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[100

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 (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

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

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

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

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

[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