LCIS题,最开始的时候以为是最长回文子串,一顿百度,一顿改,WA····,后来百度到题解···,剁手,是LCIS,也就是最长公共上升子序列,我们最开始的想法呢,首先,根据回文串来说,我们以前做过一个类似的DP题,把一个字符串,跟自己的反串求LCS的话,就是最长的子串,我们应用类似的想法,让数组跟自己的反数组,求LCIS,在这里我们注意一下,这个LCIS可能是奇数个,也可能是偶数个,所以我们在求LCIS的时候有一些处理。
代码:
#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define ll __int64
#define lll unsigned long long
#define MAX 1000009
#define eps 1e-8
#define INF 0xfffffff
using namespace std;
int dp[MAX];
int a[MAX];
int b[MAX];
int LCIS(int *a, int n, int *b)
{
memset(dp, 0, sizeof(dp));
int ans = 1;
for(int i = 1; i <= n; i++)
{
int tmp = 0;
for(int j = 1; j <= (n - i + 1); j++)
{
if(a[i] > b[j] && dp[j] > tmp)
tmp = dp[j];
else if(a[i] == b[j])
dp[j] = tmp+1;
if(i<(n+1-j))//偶数的时候
ans = max(ans,dp[j]*2);
else //奇数的时候
ans = max(ans,dp[j]*2 - 1);
}
}
cout<<ans<<endl;
}
int main()
{
int n,m,t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i = 1; i<=n; i++)
{
scanf("%d",&a[i]);
b[n + 1 - i] = a[i];
}
LCIS(a,n,b);
}
return 0;
}