zoukankan      html  css  js  c++  java
  • 最长公共子序列(LCS动态规划)?

    // dp[i][j] 计算去最大长度,记住口诀:相等左上角加一,不等取上或左最大值
    function LCS(str1, str2){
            var rows =  str1.split("")
            rows.unshift("")
            var cols =  str2.split("")
            cols.unshift("")
            var m = rows.length
            var n = cols.length
            var dp = []
            for(var i = 0; i < m; i++){
                dp[i] = []
                for(var j = 0; j < n; j++){
                    if(i === 0 || j === 0){
                        dp[i][j] = 0
                        continue
                    }
                  
                    if(rows[i] === cols[j]){
                        dp[i][j] = dp[i-1][j-1] + 1 //对角+1
                    }else{
                        dp[i][j] = Math.max( dp[i-1][j], dp[i][j-1]) //对左边,上边取最大
                    }
                }
                console.log(dp[i].join(""))//调试
            }
            return dp[i-1][j-1]
        }
    //!!!如果它来自左上角加一,则是子序列,否则向左或上回退。
    //findValue过程,其实就是和 就是把T[i][j]的计算反过来。
    // 求最长子序列
    function findValue(input1,input2,n1,n2,T){
        var i = n1-1,j=n2-1;
        var result = [];//结果保存在数组中
        console.log(i);
        console.log(j);
        while(i>0 && j>0){
            if(input1[i] == input2[j]){
                result.unshift(input1[i]);
                i--;
                j--;
            }else{
                //向左或向上回退
                if(T[i-1][j]>T[i][j-1]){
                    //向上回退
                    i--;
                }else{
                    //向左回退
                    j--;
                }
            }

        }

        console.log(result);
    }

    Java Program!
  • 相关阅读:
    uva 11549
    uva 11078
    uva 1335
    uva 1267
    uva 11520
    uva 12124
    uva 10795 A Different Task
    ACM俱乐部算法基础练习赛(1)
    【BZOJ1010】玩具装箱
    【BZOJ1901】Dynamic Rankings
  • 原文地址:https://www.cnblogs.com/programb/p/14068861.html
Copyright © 2011-2022 走看看