zoukankan      html  css  js  c++  java
  • 算法学习——动态规划之点数值三角形的最小路径

    算法描述

    在一个n行的点数值三角形中,寻找从顶点开始每一步可沿着左斜或者右斜向下直到到达底端,使得每个点上的数值之和为最小

    右图为一个4行的点数值三角形

    算法思路

    1. 接收用户输入行数n

    2. 使用一个二维数组a[n+1][n+1]来存放各个点上的数值,数值可以由用户输入或者是随机生成

    3. 定义一个二维数组(用来存放方向)direction[n+1][n+1],存放1或0,1代表右0代表左

    4. 定义一个二维数组b[n+1][n+1] 表示到底端的数值之和

      以上图4行的点数值三角形为例

      b[4][1]=47 b[4][2]=93

      b[3][1]=43

      这里b[3][1]是可以等于47,也可以等于93,但题目要求的是最小,所以这里取小的值

      b[3][1]其实是由逆推得到的,具体看下面

    5. b[n+1][n+1]的递推关系

      • 初始值

        从最后一行开始

        b[n][i]=a[n][i] i遍历完最后一行的所有元素

      • 递推关系

        b[n][i]=Math.min(b[n+1][i],b[n+1][i+1]) 取最小值

    算法实现

    	System.out.println("输入数字三角形的行数n:");
    	Scanner scanner = new  Scanner(System.in);
    	int n = scanner.nextInt();
    	scanner.close();
    	int[][] a= new int[n+1][n+1];
    
    	//随机赋值数字三角形
    	for(int i=1;i<n+1;i++){
    		for(int j =1;j<=i;j++){
    			a[i][j] = (int) (Math.random()*100);
    		}
    
    	}
    	//输出数字三角形
    	for(int i=1;i<n+1;i++){
    		for(int j =1;j<=i;j++){
    			System.out.print(a[i][j]+"    ");
    		}
    		System.out.println("");
    
    	}
    
    	int[][] b = new int[n+1][n+1];
    	int[][] direction = new int[n+1][n+1];//0是左,1是右
    
    	//最后一行的长度为其本身
    	for(int i=1;i<n+1;i++){
    		b[n][i] = a[n][i];
    	}
    
    	//关键逆推代码
    	for(int i=n-1;i>=1;i--){
    		for(int j=1;j<=i;j++){
    			if(b[i+1][j+1]<b[i+1][j]){
    				b[i][j]=a[i][j] + b[i+1][j+1];
    				direction[i][j]=1;//右边的数值较小,则记录方向为右
    
    			}else{
    				b[i][j]=a[i][j] + b[i+1][j];
    				direction[i][j]=0;//左边的数值较小,则记录方向为左
    			}
    		}
    	}
    	System.out.println("最小路径和为"+b[1][1]);
    	int flag = 1;
    	int j=1;
    	//循坏结束
    	while(flag!=n){
    		System.out.print(a[flag][j]);
    		if(direction[flag][j]==1){
    			System.out.print("->向右");
    			flag++;
    			j++;
    
    		}else{
    			System.out.print("->向左");
    			flag++;
    		}
    
    	}
    	System.out.print("->"+a[flag][j]);
    
    }
    

    结果

  • 相关阅读:
    Python自制小时钟,并转换为exe可执行程序详解
    Linux下搭建jmeter
    adb server is out of date. killing完美解决
    Python通过百度Ai识别图片中的文字
    robotframework在3.7下的搭建
    VIVO 手机重力传感器踩坑记录
    GPU 实现 RGB -- YUV 转换 (OpenGL)
    iOS UImage 与 RGB 裸数据的相互转换
    CVPixelBuffer的创建 数据填充 以及数据读取
    glReadPixel 读取数据错误问题
  • 原文地址:https://www.cnblogs.com/stars-one/p/9954821.html
Copyright © 2011-2022 走看看