可能性展开的常见方式
1 基于两侧端点讨论的可能性展开
2 基于范围上划分点的可能性展开
题目一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Solution { package class076;
public static int minInsertions(String str) { char[] s = str.toCharArray(); int n = s.length; int[][] dp = new int[n][n]; for (int l = 0; l < n - 1; l++) { dp[l][l + 1] = s[l] == s[l + 1] ? 0 : 1; } for (int l = n - 3; l >= 0; l--) { for (int r = l + 2; r < n; r++) { if (s[l] == s[r]) { dp[l][r] = dp[l + 1][r - 1]; } else { dp[l][r] = Math.min(dp[l][r - 1], dp[l + 1][r]) + 1; } } } return dp[0][n - 1]; } }
|
题目二
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package class076;
|
题目三
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| package class076;
public static int minScoreTriangulation2(int[] arr) { int n = arr.length; int[][] dp = new int[n][n]; for (int l = n - 3; l >= 0; l--) { for (int r = l + 2; r < n; r++) { dp[l][r] = Integer.MAX_VALUE; for (int m = l + 1; m < r; m++) { dp[l][r] = Math.min(dp[l][r], dp[l][m] + dp[m][r] + arr[l] * arr[m] * arr[r]); } } } return dp[0][n - 1]; }
|