2014-06-07 28 views
0

據我所知,DP要麼是從更大的問題開始,遞歸地下降,並且每次都要保存值以備將來使用,或者迭代執行並保持值自下而上。但是如果我自下而上但遞歸地上升呢?以下方法動態編程

說,例如以下問題,Longest Common Subsequence

這裏是我的解決方案

public class LongestCommonSubseq { 

/** 
* @param args 
*/ 
public static List<Character> list = new ArrayList<Character>(); 
public static int[][] M = new int[7][7]; 
public static void main(String[] args) { 
    String s1 = "ABCDGH"; 
    String s2 = "AEDFHR"; 
    for(int i=0;i<=6;i++) 
     for(int j=0;j<=6;j++) 
      M[i][j] = -1; 
    int max = getMax(s1,s2,0,0); 
    System.out.println(max); 
    Collections.sort(list); 
    for(int i = 0;i < max;i++) 
     System.out.println(list.get(i)); 

} 

public static int getMax(String s1, String s2,int i ,int j){ 
    if(i >= s1.length() || j>= s2.length()){ 
     M[i][j] = 0; 
     return M[i][j]; 
    } 

    if(M[i][j] != -1) 
     return M[i][j]; 
    if(s1.charAt(i) == s2.charAt(j)){ 
     M[i][j] = 1 + getMax(s1,s2,i+1,j+1); 
     list.add(s1.charAt(i)); 
    } 

    else 
     M[i][j] = max(getMax(s1,s2,i+1,j) , getMax(s1, s2, i, j+1)); 

    return M[i][j]; 
} 

public static int max(int a,int b){ 
    return a > b ? a : b; 
} 
} 

所以你看,我從要去[0] [0]在另一個方向,但我沒有做它迭代。 但我想應該沒問題。只需要確認。

謝謝

回答

1

方向沒關係。更重要的是,你從更一般的(複雜)問題轉向更簡單的問題。你所做的是動態編程。

1

對於動態編程,如果您遵循自底向上自頂向下 -paradigm,則無關緊要。動態規劃的基本論點(如您已正確提到的)被稱爲貝爾曼原理最優這是下面的:最優的

原理:一個最優策略具有這樣的特性: 無論初始狀態和最初的決定是,其餘的 決定必須構成關於第一個決定導致的州 的最優策略。

資源:維基百科(http://en.wikipedia.org/wiki/Bellman_equation#Bellman.27s_Principle_of_Optimality

一個偉大的方式來從遞歸調用樹砍的一些最佳的子解決方案是(在你的代碼等)使用高速緩存。