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 }

 

 —— 唯有无形之物,在时光中永存。

posted @ 2018-12-04 14:47  南條雪绘  阅读(129)  评论(0编辑  收藏  举报