• hdu FatMouse's Speed 动态规划DP


    动态规划的解决方法是找到动态转移方程。

    题目地址:http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=3&sectionid=2&problemid=4

     

    题目大意:找到一个最多的老鼠序列,使得序列中的老鼠的体重满足递增,相应老鼠的速度满足递 减。即可要求找出老鼠体重递增,速度递减的最长子序列(不需要连续).

    思路:动态转移方程的确定,状态f[i]表示前i个老鼠中的最长递减子序列长度,状态转移方程为mouse[i].len = max{mouse[i].len, mouse[j].speed > mouse[i].speed} + 1, 最后找出最大的f[i]即可。

    注意:此题还需要输出找到的序列中的老鼠的最原始的标号,因此不仅要在刚开始的时候把每个老鼠的最初的序号记下来,还要在进行 状态转移的时候把当前的老鼠的位置标记下来。

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<algorithm>
     6 #define Maxn 10010
     7 using namespace std;
     8 
     9 struct node{
    10 int id;
    11 int weight;
    12 int speed;
    13 int pre;
    14 int len ;
    15 }mouse[Maxn];
    16 
    17 int cmp(const struct node &a,const struct node &b)
    18 {
    19     if(a.weight!=b.weight)
    20         return a.weight<b.weight;
    21     return a.speed<b.speed;
    22 
    23 }
    24 
    25 void output(int k)
    26 {
    27     if(mouse[k].len==1)
    28         printf("%d
    ",mouse[k].id);
    29     else
    30     {
    31         output(mouse[k].pre);
    32         printf("%d
    ",mouse[k].id);
    33     }
    34 }
    35 
    36 int main()
    37 {
    38     int cnt=0;
    39     while(scanf("%d%d",&mouse[cnt].weight,&mouse[cnt].speed))
    40     {
    41         mouse[cnt].id=cnt+1;
    42         mouse[cnt].len=1;
    43         cnt++;
    44     }
    45     sort(mouse,mouse+cnt,cmp);
    46     int i,j;
    47     for(i=0;i<cnt;i++)
    48         for(j=0;j<i;j++)
    49     {
    50         if(mouse[i].weight>mouse[j].weight&&mouse[i].speed<mouse[j].speed)//状态转移方程使用
    51             if(mouse[i].len<mouse[j].len+1)
    52         {
    53             mouse[i].len=mouse[j].len+1;
    54             mouse[i].pre=j;
    55         }
    56     }
    57 
    58 
    59     int num=0;
    60     for(i=0;i<cnt;i++)
    61         if(mouse[num].len<mouse[i].len)
    62              num=i;//记录下表
    63     printf("%d
    ",mouse[num].len);
    64     output(num);
    65     return 0;
    66 
    67 } 
  • 相关阅读:
    echarts学习:简单柱状图和折线图
    pymongo的正则查询
    nginx学习:配置文件及其组成
    nginx实战:flaks + uwgsi + nginx部署
    nginx:学习三
    celery使用实例
    luoguP2742 二维凸包 / 圈奶牛Fencing the Cows
    AtCoder Grand Contest 025 Problem D
    luoguP3960 [noip2017]列队(树状数组)
    bzoj3223: Tyvj 1729 文艺平衡树(splay翻转操作)
  • 原文地址:https://www.cnblogs.com/chengxs/p/5267560.html
Copyright © 2020-2023  润新知