1. 程式人生 > >2017暑假 動態規劃

2017暑假 動態規劃

pac ret main 長度 blog using lower style ron

  • 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 }
View Code

ps: 第二次寫!!!ansd[n-i-1] = len;這裏n-i-1寫成了i。。。wa了一下午QAQ。

2017暑假 動態規劃