题目链接
动态规划的方式:
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. "); 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 }
—— 唯有无形之物,在时光中永存。