• 1.最小路径和(矩形)

给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径。

注:你在同一时间只能向下或者向右移动一步

样例1:
1 3 1

1 5 1

4 2 1

输出:7

样例2:

1 3 5 9 
8 1 3 4 
5 0 6 1 
8 8 4 0 

输出:12

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int m = sc.nextInt();
		int n = sc.nextInt();
		int temp[][] = new int[m][n];
		for(int i = 0; i < m; i++){
			for(int j = 0; j < n; j++){
				temp[i][j] = sc.nextInt();
			}
		}
		System.out.print(minpath(temp));
	}
	
	public static int minpath(int a[][]) {
		
		if(a == null){
			return -1;
		}
		int m = a.length;
		int n = a[0].length;
		int dp[][] = new int[m][n];
		dp[0][0] = a[0][0];
		for(int i = 1; i < m; i++){
			dp[i][0] = dp[i - 1][0] + a[i][0];
		}
		for(int j = 1; j < n; j++){
			dp[0][j] = dp[0][j - 1] + a[0][j];
		}
		for(int i = 1; i < m; i++){
			for(int j = 1; j < n; j++){
				dp[i][j] = Math.min(dp[i - 1][j] + a[i][j], dp[i][j - 1] + a[i][j]);
			}
		}
		return dp[m - 1][n - 1];		
	}
}

 

  • 2.最小路径和(三角形)

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

样例:给定三角形

[2], 
[3,4],
[6,5,7],
[4,1,8,3]
 
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int H = sc.nextInt();
		List<List<Integer>> triangle = new ArrayList<>();
		for(int i = 0; i < H; i++){
			List<Integer> list = new ArrayList<Integer>();
			for(int j = 0; j <= i ; j++){				
				list.add(sc.nextInt());
			}
			triangle.add(list);
		}
		System.out.print(minpath(triangle));
	}
	
	public static int minpath(List<List<Integer>> triangle) {
		
		if(triangle == null || triangle.size() == 0){
			return 0;
		}
		int dp[][] = new int[triangle.size()][triangle.size()];
		for(int i = 0; i < triangle.size(); i++){
			dp[triangle.size() - 1][i] = triangle.get(triangle.size() - 1).get(i);
		}
		for(int i = triangle.size() - 2; i >= 0; i--){
			for(int j = 0; j <= i; j++){
				dp[i][j] = Math.min(dp[i + 1][j] + triangle.get(i).get(j), dp[i + 1][j + 1] + triangle.get(i).get(j));
			}
		}
		return dp[0][0];		
	}
}

  

 

  • 3.不同路径个数

a.给定一个m*n网格,统计从左上角到右下角的所有路径个数。

注:你在同一时间只能向下或者向右移动一步

样例1:

输入: m = 3, n = 2
输出: 3

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int m = sc.nextInt();
		int n = sc.nextInt();
		int temp[][] = new int[m][n];
		System.out.print(countpath(temp));
	}
	
	public static int countpath(int a[][]) {
		
		int m = a.length;
		int n = a[0].length;
		int dp[][] = new int[m][n];
		for(int i = 0; i < m; i++){
			dp[i][0] = 1;
		}
		for(int j = 0; j < n; j++){
			dp[0][j] = 1;
		}
		for(int i = 1; i < m; i++){
			for(int j = 1; j < n; j++){
				dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
			}
		}
		return dp[m - 1][n - 1];		
	}
}

 b.给定一个m*n网格,统计从左上角到右下角的所有路径个数(考虑图中有障碍物)。

注:障碍物和无障碍物可以分别用 1 和 0 来表示。

 

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int m = sc.nextInt();
		int n = sc.nextInt();
		int temp[][] = new int[m][n];
		for(int i = 0; i < m; i++){
			for(int j = 0; j < n; j++){
				temp[i][j] = sc.nextInt();
			}
		}
		System.out.print(countpath(temp));
	}
	
	public static int countpath(int a[][]) {
		
		int m = a.length;
		int n = a[0].length;
		int dp[][] = new int[m][n];
		for(int i = 0; i < m; i++){
			if(a[i][0] == 1){
				break;
			}
			dp[i][0] = 1;
		}
		for(int j = 0; j < n; j++){
			if(a[0][j] == 1){
				break;
			}
			dp[0][j] = 1;
		}
		for(int i = 1; i < m; i++){
			for(int j = 1; j < n; j++){
				if(a[i][j] == 0){
					dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
				}				
			}
		}
		return dp[m - 1][n - 1];		
	}
}

 

  

 

posted on 2019-09-19 15:37  smile学子  阅读(1830)  评论(0编辑  收藏  举报