zoukankan      html  css  js  c++  java
  • UVA11456--dp,LIS

    这道题是个不错的dp题,可以放在区域赛签到题或者铜牌题。

    这题希望火车序列最长,我们可以想到,如果一辆车ai如果能被放上去,先不管之前放上了多少辆车,以及这辆车是什么时候放上去的,但是我们可以确定的是,以后能放的车的最大数量,这个是固定的,因为以后的车要么比ai大,要么比ai小,比ai大的放在ai的左边,比ai小的放在右面。但是可惜如果这辆车之前还有车的话,是会对以后产生影响的,所以我们想,如果这辆车是放上去的第一个就好了,注意是放上去的第一个而不是第一个放上去的,因为我可以放弃开头的一些车,等到后面才开始放,所以这个模型就是:

    枚举以ai为第一辆被放上去的车,求他后面比他小和比他大的数,即以ai为开头,一直到结尾的最长上升and下降子序列。。。于是这就成了一道水题

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<cstdio>
    #include<string>
    #include<cmath>
    #include<vector>
    #include<stack>
    #include<queue>
    #define INF 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    const int maxn = 1e5;
    
    int a[maxn];
    int d1[maxn],d2[maxn];
    int t,n;
    
    int main()
    {
         for(cin>>t; t; t--) {
              memset(d1,0,sizeof(d1));
              memset(d2,0,sizeof(d2));
              scanf("%d",&n);
              for(int i = 0; i < n; ++i) {
                   scanf("%d",a + i);
              }
              int maxlen = 0;
              for(int i = n-1; i >= 0; --i)
              {
                  d1[i] = d2[i] = 1;
                  for(int j = n-1; j > i; --j)
                  {
                      if(a[i] > a[j]) d1[i] = max(d1[i],d1[j] + 1);
                      if(a[i] < a[j]) d2[i] = max(d2[i],d2[j] + 1);
                  }
                  maxlen = max(d1[i] + d2[i] - 1,maxlen);
              }
              printf("%d
    ",maxlen);
         }
    }
  • 相关阅读:
    ThinkPHP讲解(一)框架基础
    smarty简单介绍
    留言板
    文件系统处理
    文件上传(带有预览模式)
    文件上传(无预览模式版)
    注册、登陆、审核练习
    session讲解(二)——商城购物车练习
    session讲解(一)——登录网页练习
    P6216 回文匹配
  • 原文地址:https://www.cnblogs.com/Norlan/p/4872942.html
Copyright © 2011-2022 走看看