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 }

         

  • 相关阅读:
    [Learn AF3]第二章 App Framework 3.0的组件View——AF3的驱动引擎
    [Learn AF3]第一章 如何使用App Framework 3.0 构造应用程序
    [译]Intel App Framework 3.0的变化
    手机浏览器中屏蔽img的系统右键菜单context menu
    HTML5 touche vents drag to move & AF actionsheet by longTap
    HTML5 FileReader
    【转】Gulp入门基础教程
    【Intel AF 2.1 学习笔记三】
    【Intel AF 2.1 学习笔记二】AF中的页面——Panel
    【Intel AF 2.1 学习笔记一】AF程序结构
  • 原文地址:https://www.cnblogs.com/lj030/p/3237325.html
Copyright © 2011-2022 走看看