zoukankan      html  css  js  c++  java
  • hdu 4512

    LICS的应用。还是从最后的结果考虑,肯定是在某个位置的i左边(包括i)递增的序列,右边(包括i)相应的对称的递减的序列,这个序列肯定是,1--i和i--n的逆序的公共递增序列,而1--i和i--n的逆序的公共递增序列肯定是一个符合题意的选择,那么以i为分界点的最优解肯定就是1--i和i--n的逆序的最长公递增序列。然后枚举位置i取以i为分界点的最优解的最大解就可以了。先按这个思路A了,有很多无用的循环,又优化了下。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <queue>
     5 #include <algorithm>
     6 #include <cmath>
     7 #include <stack>
     8 #include <vector>
     9 #define LL long long
    10 using namespace std;
    11 const int inf=0x3f3f3f3f;
    12 const int maxn=200+10;
    13 int f[maxn][maxn];
    14 int a[maxn];
    15 int main()
    16 {
    17     int T;
    18     cin>>T;
    19     while(T--)
    20     {
    21         int n;
    22         cin>>n;
    23         int i;
    24         for(i=1;i<=n;i++) cin>>a[i];
    25         int ans=0;
    26         int j,k,maxv;
    27         for(i=1;i<=n;i++)
    28         {
    29             memset(f,0,sizeof(f));
    30             for(j=1;j<=i;j++)
    31             {
    32                 maxv=0;
    33                 for(k=n;k>=i;k--)
    34                 {
    35                     f[j][k]=f[j-1][k];
    36                     if(a[j]==a[k]) f[j][k]=maxv+1;
    37                     if(a[k]<a[j]&&f[j-1][k]>maxv) maxv=f[j-1][k];
    38                 }
    39             }
    40             for(k=n;k>i;k--) ans=max(ans,f[i][k]*2);
    41             ans=max(ans,f[i][k]*2-1);
    42         }
    43         printf("%d
    ",ans);
    44     }
    45 }

    优化后

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <queue>
     5 #include <algorithm>
     6 #include <cmath>
     7 #include <stack>
     8 #include <vector>
     9 #define LL long long
    10 using namespace std;
    11 const int inf=0x3f3f3f3f;
    12 const int maxn=200+10;
    13 int f[maxn];
    14 int a[maxn];
    15 int main()
    16 {
    17     int T;
    18     cin>>T;
    19     while(T--)
    20     {
    21         int n;
    22         cin>>n;
    23         int i;
    24         for(i=1;i<=n;i++) cin>>a[i];
    25         int ans=0;
    26         int k,maxv;
    27         memset(f,0,sizeof(f));
    28         for(i=1;i<=n;i++)
    29         {
    30                 maxv=0;
    31                 for(k=n;k>=i;k--)
    32                 {
    33                     if(a[i]==a[k]) f[k]=maxv+1;
    34                     if(a[k]<a[i]&&f[k]>maxv) maxv=f[k];
    35                 }
    36             for(k=n;k>i;k--) ans=max(ans,f[k]*2);
    37             ans=max(ans,f[k]*2-1);
    38         }
    39         printf("%d
    ",ans);
    40     }                                                    
    41 }

         

  • 相关阅读:
    使用python对mysql主从进行监控,并调用钉钉发送报警信息
    CentOS7下安装gitlab
    nginx日志自动切割
    Mysql定时备份数据脚本
    Linux下搭建FTP服务
    linux系统盘使用率达到100%的问题查找和解决方法
    CentOS6.5+nginx+mysql+php(laravel)服务器环境搭建
    RHEL6和RHEL7恢复root用户密码
    在Dell R720服务器上安装ESXI5.5时会出现卡在LSI_MR3.V00的解决方法
    /23 /24 /26/28 /29 /30或10.0.0.1/29这样怎么算服务器IP数是多少?
  • 原文地址:https://www.cnblogs.com/lj030/p/3237325.html
Copyright © 2011-2022 走看看