zoukankan      html  css  js  c++  java
  • hdu1160 dp

    hdu1160

    题意:给出很多老鼠的数据,分别是它们的体重和跑速,为了证明老鼠越重跑得越慢,要找一组数据,由若干个老鼠组成,保证老鼠的体重依次增加而跑速依次减小,问这组数据最多能有多少老鼠,并按体重从小到大输出这些老鼠的顺序。

    并不是难题,我觉得有点类似穷国富国或者是堆砖块,我的做法就是首先将这些老鼠按体重从大到小排序(为什么从大到小呢,因为我是用结构体模拟指针记录了上一只老鼠的序号,所以最终会倒序输出,排序的时候就按倒序排序了)

    昂,介绍下我的结构体,是记录了 w(weight),s(speed),n(number),l(last),体重和速度肯定是要记录的用于比较,n 是由于我要进行排序,数组下标会被打乱,所以用 n 单独记录这只老鼠原本的位置,l 则是记录这只老鼠上一只老鼠的数组下标,如果前面没有老鼠,那就是指向第 0 只老鼠(重量是极大,速度是 0,n 、 l 都初始化为0).

    当对体重排完序之后,就从前往后开始 dp ,对第 i 只老鼠,遍历从 0 到 i - 1 的老鼠 j ,如果 j 比 i 重而且速度慢,那就 dp[ i ] = max ( dp [ i ] , dp [ j ] + 1 ),并且判断 dp [ i ] 是不是最大值,如果是就记录下 i 便于最后输出数据量最大的一组老鼠。

    然后就这么结束了。

    恩,接下来是吐槽时间,看见我代码里面一堆堆绿翔色的 debug 代码了吗```是的,一开始我读入都不对,我计数的 c 是在读取数据的时候 ++c 的,但是每次读两个数据,我就很自以为是地一个用了 ++c 一个直接 c,以为会在第一个加了,第二个就是沿用加过的,于是```各种坑,++这种东西还是要足够水平才能用啊,我这种渣渣还是老老实实后面加 c++ 吧```;

    这并不是全部,然后我在纠结样例那个顺序究竟是怎么得到的呢!!!为什么我每次都和它有一两个不一样,我试了要不要排速度? dp 值相等的时候要不要取?各种各种,正当我即将绝望想要求助学长的时候```我突然看到说只要求一种可行解就可以了!!!英语啊我的英语啊谁来拯救我的英语啊!!!

    恩并不止是这样,当我明白是其中一种正确解就可以的时候我果断提交!WA!!!WTF!!!我换了种姿势又WA了一发,我觉得是时候找学长们谈论一下人生了```然后我突然又发现```由于读入的时候没有说读入多少个只是读到文件结束,所以我自己加了个读 9 个数据就跳出读取循环为了测试给的样例,但是我并记不住把它删掉!```果然把它注释掉就 AC 了,我的心好累,连 hdu 都要欺负我这种智商不过关的渣渣啊```

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<algorithm>
     4 using namespace std;
     5 #define max(a,b) a>b?a:b
     6 #define inf 0x3f3f3f3f
     7 int dp[1050];
     8 
     9 struct Mouse{
    10     int w,s,n,l;
    11 }m[1050];
    12 
    13 int cmp(Mouse m1,Mouse m2){
    14     if(m1.w==m2.w)return m1.s<m2.s;
    15     return m1.w>m2.w;
    16 }
    17 
    18 int main(){
    19     int c=1,i,j;
    20     while(scanf("%d%d",&m[c].w,&m[c].s)!=EOF){
    21         m[c].n=c;
    22         m[c].l=0;
    23 //        if(c==9)break;
    24         c++;
    25     }
    26 /*    
    27     printf("
    ");
    28     for(i=1;i<=c;i++)printf("%d %d
    ",m[i].w,m[i].s);
    29     printf("
    ");
    30 */
    31     sort(m+1,m+c+1,cmp);
    32     m[0].w=inf;
    33     m[0].s=0;
    34     m[0].l=0;
    35     m[0].n=0;
    36     int ans=0;
    37 /*    printf("
    ");
    38     for(i=0;i<=c;i++){
    39         printf("%d %d
    ",m[i].w,m[i].s);
    40     }
    41     printf("
    ");
    42 */    for(i=1;i<=c;i++){
    43         dp[i]=0;
    44         for(j=0;j<i;j++){
    45             if(m[j].w>m[i].w&&m[j].s<m[i].s){
    46                 if(dp[j]+1>=dp[i]){
    47                     dp[i]=dp[j]+1;
    48                     m[i].l=j;
    49                     if(dp[i]>dp[ans])ans=i;
    50                 }
    51             }
    52         }
    53     }
    54     printf("%d
    ",dp[ans]);
    55     while(m[ans].l!=0){
    56 //        printf("%d %d ",m[ans].w,m[ans].s);
    57         printf("%d
    ",m[ans].n);
    58         ans=m[ans].l;
    59     }
    60 //    printf("%d %d ",m[ans].w,m[ans].s);
    61     printf("%d
    ",m[ans].n);
    62     return 0;
    63 }
    View Code
  • 相关阅读:
    ConcurrentHashMap总结
    HashMap在多线程环境下操作可能会导致程序死循环
    oracle数据库的 to char 和to date 区别(时间格式化)
    SQL中的cast()函数用法
    常见的垃圾收集器有3类-java面试一
    mybatis中sql引用
    mysql find_in_set 查询
    用Redis实现微博关注关系的分析
    C#与C++相比较之STL篇(续一)
    Vite2.0 入门
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/4290837.html
Copyright © 2011-2022 走看看