参考程序:
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n;
while (cin >> n) {
char a[101];
int dp[101][101] = {0}; // dp[i][j] 表示从i到j的最少操作次数
// 输入密码字符串
for (int i = 1; i <= n; i++) {
cin >> a[i];
dp[i][i] = 1; // 一个字符的子串,至少1次操作
}
// 动态规划:填充 dp 表
for (int len = 2; len <= n; len++) { // 子串的长度从2开始
for (int i = 1; i <= n - len + 1; i++) {
int j = i + len - 1; // 终止位置
dp[i][j] = dp[i][j - 1] + 1; // 默认情况:加1次操作
// 判断是否可以合并操作
if (a[j] == a[j - 1]) {
dp[i][j] = min(dp[i][j], dp[i][j - 1]); // 只增加1次操作
}
if (a[j] == a[i]) {
dp[i][j] = min(dp[i][j], dp[i + 1][j - 1] + 1); // 连接i到j的字符
}
// 考虑在[i..j]之间分段的情况
for (int k = i; k < j; k++) {
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);
}
}
}
// 输出最少操作次数,即dp[1][n]
cout << dp[1][n] << endl;
}
return 0;
}