暑期实习 算法 Day2

92 阅读1分钟

区间DP

516. 最长回文子序列 - 力扣(Leetcode)

dfs(i,j)表示[i,j]的最长回文子序列长度dfs(i,j)表示[i,j]的最长回文子序列长度

dfs(i,i)=1dfs(i,i)=1

dfs(i+1,i)=0dfs(i+1,i)=0

状态转移方程

dfs(i,j)=dfs(i+1,j1)+2    when    s[i]=s[j]dfs(i,j)=dfs(i+1,j-1) + 2 \; \; when \; \; s[i] = s[j]

dfs(i,j)=max(dfs(i+1,j),dfs(i,j1))    when    s[i]s[j]dfs(i,j)=max(dfs(i+1,j),dfs(i,j-1)) \;\; when \;\; s[i] \ne s[j]

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)

dfs(i,i+1)=0dfs(i,i+1) = 0

dfs(i,j)=maxk=i+1j1{dfs(i,k)+dfs(k,j)+v[i]×v[j]×v[k]}dfs(i,j) = max_{k = i + 1}^{j-1} \{ dfs(i,k) + dfs(k,j) + v[i] \times v[j] \times v[k] \}

		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转换顺序时,可以先写出回溯的形式然后记忆化搜索即可