大佬们,帮我看看这个思路行不行
查看原帖
大佬们,帮我看看这个思路行不行
1434247
Prefixium楼主2024/8/28 22:21
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int n;
int dp[N][N][2];
/* 
    一个字符串合法,当且仅当满足以下条件:
    - 字符串由两个相同字符组成
    - 字符串由两个相同字符中间夹着一个合法字符串组成
    - 字符串由两个合法字符串组成
    因此定义 dp[l][r][0] 为区间 [l, r] 中合法字符串的数量,dp[l][r][1] 为区间 [l, r] 是否为合法字符串
    - 当 l - r == 1 时并且 s[l] == s[r] 时,dp[l][r][0] = 1,dp[l][r][1] = 1
    - 否则当 s[l] == s[r] 时,dp[l][r][0] = (dp[l][r][1] &= dp[l + 1][r - 1][1]) * (dp[l + 1][r - 1][0] + 1)
    - 否则 dp[l][r][0] = (dp[l][r][1] &= (dp[l][k] && dp[k][r])) * (dp[l][k][0] + dp[k][r] + 1)
*/
int main() {
	cin >> n;
	string s;
	cin >> s;
	s = " " + s;
	for (int len = 2; len <= n; ++len) {
		for (int l = 1; l + len - 1 <= n; ++l) {
			int r = l + len - 1;
			if (len == 2 && s[l] == s[r]) {
				dp[l][r][0] = dp[l][r][1] = 1;
			} else if (s[l] == s[r]) {
				dp[l][r][0] = (dp[l][r][1] |= dp[l + 1][r - 1][1]) * (dp[l + 1][r - 1][0] + 1);
			} else {
				for (int k = l + 1; k < r; k++) {
					if (dp[l][k][1] && dp[k + 1][r][1]) {
						dp[l][r][0] = max(dp[l][r][0], dp[l][k][0] + dp[k + 1][r][0] + 1);
						dp[l][r][1] = 1;
					}
				}
			}
		}
	}
	cout << dp[1][n][0];
	return 0;
}
2024/8/28 22:21
加载中...