题意:
。。。
思路:
区间DP入门题
char str[N+5];
int dp[N][N];
inline bool match(int x, int y) {
return str[x] == '(' && str[y] == ')' || str[x] == '[' && str[y] == ']';
}
int main() {
while ( scanf("%s", str) != EOF ) {
if ( str[0] == 'e' ) break;
int n = strlen(str);
memset(dp, 0, sizeof(dp));
for (int i = 0; i < n - 1; ++ i) dp[i][i+1] = match(i, i+1);
for (int k = 3; k <= n; ++ k) {
for (int i = 0; i + k - 1 < n; ++ i) {
int j = i + k - 1;
dp[i][j] = match(i, j) + dp[i+1][j-1];
for (int o = i; o < j; ++ o)
dp[i][j] = max ( dp[i][j], dp[i][o] + dp[o+1][j] );
}
}
printf("%d\n", dp[0][n-1] * 2);
}
return 0;
}
本文介绍了一道经典的区间动态规划入门题目,通过匹配字符来计算最大得分。使用二维数组dp记录状态,通过迭代填充dp表格,最终输出最大可能得分。
730

被折叠的 条评论
为什么被折叠?



