動態規划算法(java)


一、動態規划算法

  眾所周知,遞歸算法時間復雜度很高為(2^n),而動態規划算法也能夠解決此類問題,動態規划的算法的時間復雜度為(n^2)。動態規划算法是以空間置換時間的解決方式,一開始理解起來可能比較困難,自己畫畫也許明白了很多。

 

二、動態規划算法分析

     先舉個例子:

  

       {7,0,0,0,0},{3,8,0,0,0},{8,1,0,0,0},{2,7,4,4,0},{4,5,2,6,5} 這個二維數組,求一下,頂層到底層,只能通過兩端來相加的最大值(也就是說這棵樹的最長路徑)。

分析:

(1)第一步:有底層向上層算起,因為這是一個金字塔的形狀,底層向上算起,就可以最終到一個值,這個值就是最大值,

 

(2)每一層相加,然后比較取最大數。即:

三、代碼實現

 @Test
    public void test2(){
        int[][] arr={
            {7,0,0,0,0},
            {3,8,0,0,0},
            {8,1,0,0,0},
            {2,7,4,4,0},
            {4,5,2,6,5}
        };

        int max = maxSumNew(arr,5);
        System.out.println(max);
    }


 /**
     * 動態規划
     * @param arr
     * @param n
     * @param
     * @return
     */
    public int maxSumNew(int arr[][],int n){

        if(arr==null){
            return 0;
        }
        int[][] max = new int[n][n];
        for(int i = n-1; i >=0; i--){
            for(int j = 0; j <= i; j++){
                if(i==n-1){
                    max[n-1][j] = arr[n-1][j];
                }else{
                    max[i][j] = Math.max(max[i+1][j],max[i+1][j+1]) + arr[i][j];
                }
            }
        }
        return max[0][0];
    }

 

 

以上是小弟的總結,如果有不正確的地方,還請大牛指正。

參考url:http://blog.csdn.net/baidu_28312631/article/details/47418773

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM