• 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 }

         

  • 相关阅读:
    db2 v11 安装测试
    DB2支持的三种表空间SMS、DMS、DMS的自动存储
    linux几种快速清空文件内容的方法
    修改文件或者文件夹权限
    db2start启动失败
    db2icrt创建实例,提示主机名无效
    浏览器内核以及在各个浏览器的前缀
    程序的三大结构(顺序结构、选择结构、循环结构)
    数组中元素的排序(常用的冒泡排序、选择排序、快速排序)
    数组的api以及api的简单使用
  • 原文地址:https://www.cnblogs.com/lj030/p/3237325.html
Copyright © 2020-2023  润新知