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 }

         

  • 相关阅读:
    jvm 学习
    架构师
    关于javaScript堆、栈和队列
    ES6-对象的扩展-属性名表达式
    JS 中 ++i 和i++的区别
    递归算法讲解
    Ztree 仿淘宝树结构完美实现 移动 右键增删改
    jquery zTree异步加载实例
    【zTree】简单实例与异步加载实例
    win10中用命令行打开服务
  • 原文地址:https://www.cnblogs.com/lj030/p/3237325.html
Copyright © 2011-2022 走看看