-
uva 10534 - Wavio Sequence
题意:“长度”对称的LIS。
思路:正、逆序求两次LIS,正序就ansi[i] 存放a[0]~a[i]LIS,逆序也差不多这样。。。然后拿着两个ans数组对比着找到满足条件的最大解。
代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int inf = 0x3f3f3f3f; 5 6 int main() 7 { 8 int n, in[10005], de[10005]; 9 while(~scanf("%d", &n)) 10 { 11 for(int i = 0; i < n; i++) 12 { 13 scanf("%d", &in[i]); 14 de[n-i-1] = in[i]; 15 } 16 17 int len = 1, ansi[10005], ansd[10005], dp[10005]; 18 memset(dp, inf, sizeof(dp)); 19 dp[len] = in[0]; 20 for(int i = 0; i < n; i++) 21 { 22 if(in[i] > dp[len]) dp[++len] = in[i]; 23 else 24 *lower_bound(dp+1, dp+n+1, in[i]) = in[i]; 25 ansi[i] = len; 26 } 27 len = 1, dp[len] = de[0]; 28 memset(dp, inf, sizeof(dp)); 29 for(int i = 0; i < n; i++) 30 { 31 if(de[i] > dp[len]) dp[++len] = de[i]; 32 else 33 *lower_bound(dp+1, dp+n+1, de[i]) = de[i]; 34 ansd[n-i-1] = len;//n-i-1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 35 } 36 37 int ans = 0; 38 for(int i = 0; i < n; i++) 39 { 40 int temp = min(ansi[i], ansd[i]); 41 ans = max(ans, temp*2-1); 42 } 43 printf("%d\n", ans); 44 } 45 return 0; 46 }
ps: 第二次写!!!ansd[n-i-1] = len;这里n-i-1写成了i。。。wa了一下午QAQ。
时间: 2024-12-18 08:09:28