zoukankan      html  css  js  c++  java
  • HDU-1160-FatMouse's Speed

    分析:

    1. 先对w排序,然后求最长子序列。要记录原来的位置,所以结构体定义一个n来记录原来的位置。

    2. 我们要找出这个最长子序列的长度,并且还要输出他,就需要一个数组来记录当前块所在的子序列中的后继序号。

    3. 如果从前往后找,前面的后继序号多次更新,不方便,从后往前找,只需要更新当前块。

     1 #include <bits/stdc++.h>
     2 #include<vector>
     3 using namespace std;
     4 
     5 struct node
     6 {
     7     int W;
     8     int S;
     9     int n;
    10 };
    11 bool cmp(node a,node b)
    12 {
    13 
    14     return a.W<b.W;
    15 }
    16 int dp[1100];
    17 int p[1100];
    18 struct node v[1100];
    19 int main()
    20 {
    21     int n = 1,ans;
    22     while(scanf("%d%d",&v[n].W,&v[n].S)!=EOF)
    23     {
    24         v[n].n = n;
    25         dp[n] = 1;
    26         n++;
    27     }
    28     ans = n;
    29     memset(p,0,sizeof p);
    30     dp[ans] = 0;
    31     sort(v+1,v+n,cmp);
    32 
    33     for(int i= n-1;i>=1;i--)
    34     {
    35         for(int j = n-1;j>i;j--)
    36         {
    37             if(v[j].W>v[i].W&&v[j].S<v[i].S)
    38             {
    39                 if(dp[i]<dp[j]+1)
    40                 {
    41                     dp[i] = dp[j]+1;
    42                     p[i] = j;
    43                     if(dp[ans]<dp[i])
    44                         ans = i;
    45                 }
    46             }
    47         }
    48     }
    49     for(int i=1;i< n;i++)
    50     {
    51         if(dp[i]>=1&&dp[ans]<dp[i])
    52             ans = i;
    53     }
    54     cout<<dp[ans]<<endl;
    55     while(ans!=0)
    56     {
    57         cout<<v[ans].n<<endl;
    58         ans = p[ans];
    59     }
    60     return 0;
    61 }
    注:转载请注明出处
  • 相关阅读:
    [Writeup]奇怪的单点音
    [Writeup]百度一下,你就知道
    C语言学习一个月后感想
    小黄衫获得感想及经验总结
    Ubuntu初始化配置
    在Ubuntu 18.04中安装 docker compose
    Docker安装 配置
    Laravel Heroku评价
    Laravel Deploy to Heroku
    Laravel Nuxt auth refresh
  • 原文地址:https://www.cnblogs.com/1625--H/p/9362735.html
Copyright © 2011-2022 走看看