算法-数字三角形(递归,动态规划)

1.递归:
package MOOC;

import java.util.Scanner;

/*
问题描述:
	在数字三角形中寻找一条从顶部到底部的路径,使得路径上锁经过的数字之和最大。路径上的每一步都只能往左下或右下走。只需要求出这个最大的即可,不必给出具体路径。
	三角形的行数大于1小于等于100,数字为0-99
输入格式:
3      //三角形行数
7
3 8
8 1 0
输出格式:
18
 */

//时间复杂度n^2
public class KuaiSu {

	static int[][] num,maxSum;
	static int n;
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		n=input.nextInt();
		num=new int[n][n];
		maxSum=new int[n][n];
		for(int i=0;i

将计算结果保存起来,下一次可直接取出,如果不保存重复计算次数很大,会严重超时


2.递推:
package MOOC;

import java.util.Scanner;

/*
问题描述:
	在数字三角形中寻找一条从顶部到底部的路径,使得路径上锁经过的数字之和最大。路径上的每一步都只能往左下或右下走。只需要求出这个最大的即可,不必给出具体路径。
	三角形的行数大于1小于等于100,数字为0-99
输入格式:
3      //三角形行数
7
3 8
8 1 0
输出格式:
18
 */

//时间复杂度n^2
public class KuaiSu {

	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		int n=input.nextInt();
		int[][] num=new int[n][n];
		int[][] maxSum=new int[n][n];
		for(int i=0;i=0;i--)
			for(int j=0;j<=i;j++)
				maxSum[i][j]=Math.max(maxSum[i+1][j], maxSum[i+1][j+1])+num[i][j];
		System.out.println(maxSum[0][0]);
	}
}
直接从下往上计算


你可能感兴趣的:(算法)