区间DP
516. 最长回文子序列 - 力扣(Leetcode)
状态转移方程
public int longestPalindromeSubseq(String s) {
char[] ss = s.toCharArray();
int n = ss.length;
int[][] dp = new int[n][n];
for(int i=0;i<n;i++) dp[i][i] = 1;
//注意遍历顺序
for(int i=n-1;i>=0;i--){
for(int j=i+1;j<n;j++){
if(ss[i] == ss[j]) dp[i][j] = dp[i+1][j-1] + 2;
else dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]);
}
}
return dp[0][n-1];
}
1039. 多边形三角剖分的最低得分 - 力扣(Leetcode)
将多边形看成是从i→j的多边形(加上边ij)
int[][] f;
public int minScoreTriangulation(int[] v) {
int n = v.length;
f = new int[n][n];
return dfs(0,n-1,v);
}
public int dfs(int i, int j, int[] v){
if(j==i+1) return 0;
int ans = Integer.MAX_VALUE;
if(f[i][j]!=0) return f[i][j];
for(int k=i+1;k<=j-1;k++){
ans = Math.min(ans, dfs(i,k,v) + dfs(k,j,v) + v[i] * v[j] * v[k]);
}
f[i][j] = ans;
return ans;
}
当难以直接写dp转换顺序时,可以先写出回溯的形式然后记忆化搜索即可