动态规划之三角形路径求和

来源:互联网 发布:淘宝卖家钱怎么到账 编辑:程序博客网 时间:2024/06/09 18:39

是不是因为在分类首页的分类选择不恰当的原因,发现我最近的博客浏览量好少啊

对照coursera上面北京大学的算法基础那门课,把这个例题讲的特别清楚,用了不同的方法实现,特意做一下记录

package Dynamic_P;//三角形行数最多100行,每一列中的数不超过99import java.util.Scanner;public class Math_angle {public static int [][]angle;public static int n;public static int [][]Max_sum;public static void main(String args[]) {Scanner scan=new Scanner(System.in);//读入三角形的行数n=scan.nextInt();//创建一个n+1行n+1列的数组来存储构成三角形的数//并对记录最大值的数组进行初始化angle=new int[n+1][n+1];Max_sum=new int[n+1][n+1];for(int i=1;i<=n;i++) {for(int j=1;j<=i;j++) {angle[i][j]=scan.nextInt();Max_sum[i][j]=-1;}}for(int i=1;i<=n;i++)Max_sum[n][i]=angle[n][i];//int sum=function1(1,1);//int sum=function2(1,1);//int sum=function3(1,1);int sum=function4(1,1);System.out.println(sum);}//直接递归的办法,在数据量很大时会导致很大的运算量,因为重复进行了很多操作//public static int function1(int x,int y) {////如果是最下面一行的元素//int MAX;//if(x==n)//return angle[x][y];//else {//int num1=function(x+1,y);//int num2=function(x+1,y+1);//MAX=Math.max(num1, num2)+angle[x][y];//return MAX;//}//}//用一个数组记录已经被访问过的点到最底层的路径中间的和,是最常用的做法//其本质是从顶点出发向下求//public static int function2(int x,int y) {//if(Max_sum[x][y]!=-1)//return Max_sum[x][y];//else {//int num1=function2(x+1,y);//int num2=function2(x+1,y+1);//Max_sum[x][y]=Math.max(num1, num2)+angle[x][y];//}//return Max_sum[x][y];//}//直接从下往上依层遍历,直接求出每层对应位置上应当有的最大数//public static int function3(int x,int y) {//for(int i=n-1;i>=1;i--) {//for(int j=1;j<=n-1;j++) //Max_sum[i][j]=Math.max(Max_sum[i+1][j], Max_sum[i+1][j+1])+angle[i][j];//}//return Max_sum[1][1];//}//从上面的第三种方法来看,要知道第n行的Max_sum值,只需要知道第n+1行的Max_sum值,//与第n+2行的Max_sum没有关系,而一旦求出了第n行的Max_sum值,第n+1行的Max_sum值就没有意义了//根据这个理论,我们实际只需要用一个一维的数组保存Max_sum的值就行,可以节约存储空间public static int function4(int x,int y) {for(int i=n-1;i>=1;i--) {for(int j=1;j<=n-1;j++) {angle[n][j]=Math.max(angle[n][j], angle[n][j+1])+angle[i][j];}}return angle[n][1];}}

原创粉丝点击