衆所周知,遞歸算法時間複雜度很高爲(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} 這個二維數組,求一下,頂層到底層,只能經過兩端來相加的最大值(也就是說這棵樹的最長路徑)。url
分析:spa
(1)第一步:有底層向上層算起,由於這是一個金字塔的形狀,底層向上算起,就能夠最終到一個值,這個值就是最大值,.net
(2)每一層相加,而後比較取最大數。即:code
3、代碼實現blog
@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/47418773class