import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
int n = s.length();
int[][] dp = new int[n][n];
for (int i = 0; i < n; i++) {
dp[i][i] = 1;
}
for (int len = 2; len <= n; len++) {
for (int i = 0; i + len <= n; i++) {
int j = i + len - 1;
if (s.charAt(i) == s.charAt(j)) {
dp[i][j] = dp[i][j - 1];
} else {
dp[i][j] = Integer.MAX_VALUE;
for (int k = i; k < j; k++) {
dp[i][j] = Math.min(dp[i][j], dp[i][k] + dp[k + 1][j]);
}
}
}
}
System.out.println(dp[0][n - 1]);
}
}
https://www.nowcoder.com/discuss/727521113110073344
思路:
- 输入处理:读取输入字符串并确定其长度。
- 初始化:创建一个二维数组 dp,并将所有长度为1的区间初始化为1。
- 动态规划处理:从长度为2的区间开始,逐步处理更长的区间。对于每个区间 [i, j],根据两端字符是否相同来决定状态转移方式。如果相同,则继承左端区间的值;如果不同,则遍历所有分割点,找到最小涂色次数。
- 输出结果:最终结果为 dp[0][n-1],即整个字符串的最小涂色次数。



京公网安备 11010502036488号