hdu 4512

LICS的應用。仍是從最後的結果考慮,確定是在某個位置的i左邊(包括i)遞增的序列,右邊(包括i)相應的對稱的遞減的序列,這個序列確定是,1--i和i--n的逆序的公共遞增序列,而1--i和i--n的逆序的公共遞增序列確定是一個符合題意的選擇,那麼以i爲分界點的最優解確定就是1--i和i--n的逆序的最長公遞增序列。而後枚舉位置i取以i爲分界點的最優解的最大解就能夠了。先按這個思路A了,有不少無用的循環,又優化了下。ios

 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\n",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\n",ans);
40     }                                                    
41 }
相關文章
相關標籤/搜索