1. 程式人生 > >Luogu_1944 最長括號匹配

Luogu_1944 最長括號匹配

題目連結

動態規劃的方式:

1. 上一個括號或者上一段合法序列的前一個括號和當前位置形成 (A),[A] 型合法序列;

2. 該位置所在的當前合法序列和之前的某一段與其相鄰的序列組成 AB 型合法序列。

轉移方程 dp[i] = dp[i - 1] + 2 + dp[i - dp[i - 1] - 2]。

連著兩道題了都沒有把轉移的方式考慮全面,每次都是隻過樣例……

 1 #include <queue>
 2 #include <cstdio>
 3 #include <cctype>
 4 #include <cstring>
 5
#include <iostream> 6 #include <algorithm> 7 using namespace std; 8 9 const int maxn = 1000000 + 10; 10 int n, a[maxn], dp[maxn], pos; char str[maxn]; 11 12 int main(int argc, char const *argv[]) 13 { 14 freopen("nanjolno.in", "r", stdin); 15 freopen("nanjolno.out", "w", stdout); 16 17
scanf("%s", str + 1), n = strlen(str + 1); 18 for(int i = 1; i <= n; ++i) switch( str[i] ) { 19 case '[': a[i] = 1; break; 20 case '(': a[i] = 2; break; 21 case ')': a[i] = 3; break; 22 case ']': a[i] = 4; break; 23 default: printf("Tsuki ga kirei.\n"); 24 } 25 for(int
i = 1; i <= n; ++i) if( a[i] > 2 ) { 26 if( a[i - 1 - dp[i - 1]] + a[i] == 5 ) dp[i] = dp[i - 1] + 2 + dp[i - dp[i - 1] - 2]; 27 if( dp[i] > dp[pos] ) pos = i; 28 } 29 for(int i = pos - dp[pos] + 1; i <= pos; ++i) printf("%c", str[i]); 30 31 fclose(stdin), fclose(stdout); 32 return 0; 33 }

 

 —— 唯有無形之物,在時光中永存。