LCIS HDOJ 4512 吉哥系列故事——完美队形I

 

题目传送门

 1 /*  2  LCIS应用:设置b[]为a[]的反转,然后LCIS,若相等的是自己本身,则+1, 否则+2  3 */  4 #include <cstdio>  5 #include <iostream>  6 #include <algorithm>  7 #include <cstring>  8 using namespace std;  9 10 const int MAXN = 2e2 + 10; 11 const int INF = 0x3f3f3f3f; 12 int a[MAXN], b[MAXN]; 13 int dp[MAXN][MAXN]; 14 int n; 15 16 int LCIS(void) 17 { 18 int k = 0; int ans = 0; 19 for (int i=1; i<=n; ++i) 20  { 21 k = 0; 22 for (int j=1; j<=n-i+1; ++j) 23  { 24 dp[i][j] = dp[i-1][j]; 25 if (a[i] == b[j]) 26  { 27 if (j != n - i + 1) 28  { 29 if (dp[i][j] < dp[i][k] + 2) 30 dp[i][j] = dp[i][k] + 2; 31  } 32 else 33  { 34 if (dp[i][j] < dp[i][k] + 1) 35 dp[i][j] = dp[i][k] + 1; 36  } 37  } 38 else if (a[i] > b[j]) 39 if (dp[i][j] > dp[i][k]) k = j; 40 41 if (ans < dp[i][j]) ans = dp[i][j]; 42  } 43  } 44 45 return ans; 46 } 47 48 int main(void) //HDOJ 4512 吉哥系列故事——完美队形I 49 { 50 //freopen ("HDOJ_4512.in", "r", stdin); 51 52 int t; 53 scanf ("%d", &t); 54 while (t--) 55  { 56 scanf ("%d", &n); 57 58 for (int i=1; i<=n; ++i) scanf ("%d", &a[i]); 59 for (int i=1; i<=n; ++i) b[n-i+1] = a[i]; 60 memset (dp, 0, sizeof (dp)); 61 62 printf ("%d\n", LCIS ()); 63  } 64 65 return 0; 66 }

 

你可能感兴趣的:(CI)