Luogu_1944 最长括号匹配

时间:2021-12-24 03:00:33

题目链接

动态规划的方式:

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

2. 该位置所在的当前合法序列和之前的某一段与其相邻的序列组成 AB 型合法序列。

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

连着两道题了都没有把转移的方式考虑全面,每次都是只过样例……

 #include <queue>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int maxn = + ;
int n, a[maxn], dp[maxn], pos; char str[maxn]; int main(int argc, char const *argv[])
{
freopen("nanjolno.in", "r", stdin);
freopen("nanjolno.out", "w", stdout); scanf("%s", str + ), n = strlen(str + );
for(int i = ; i <= n; ++i) switch( str[i] ) {
case '[': a[i] = ; break;
case '(': a[i] = ; break;
case ')': a[i] = ; break;
case ']': a[i] = ; break;
default: printf("Tsuki ga kirei.\n");
}
for(int i = ; i <= n; ++i) if( a[i] > ) {
if( a[i - - dp[i - ]] + a[i] == ) dp[i] = dp[i - ] + + dp[i - dp[i - ] - ];
if( dp[i] > dp[pos] ) pos = i;
}
for(int i = pos - dp[pos] + ; i <= pos; ++i) printf("%c", str[i]); fclose(stdin), fclose(stdout);
return ;
}

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