• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
不会投篮的邢
投篮三不沾
博客园    首页    新随笔    联系   管理    订阅  订阅

算法训练 数字三角形

问题描述
  (图3.1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路
  径,使该路径所经过的数字的总和最大。
  ●每一步可沿左斜线向下或右斜线向下走;
  ●1<三角形行数≤100;
  ●三角形中的数字为整数0,1,…99;


  .
  (图3.1-1)
输入格式
  文件中首先读到的是三角形的行数。

  接下来描述整个三角形
输出格式
  最大总和(整数)
样例输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
30
 
解法思路:使用动态规划的算法,当前位置的最大值等于左上方和右上方位置的路径的最大值加上当前位置的值
/**
 * 
 */
package com.xingbing.lanqiao;

import java.util.Scanner;

/**
 * @author 
 * @data
 * @description
 */
public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int a[][] = new int[n+1][n+1];
		int dp[][] = new int[n+1][n+1];
		for(int i=1;i<=n;i++){
			for(int j=1;j<=i;j++){
				a[i][j] = in.nextInt();
			}
		}
		dp[1][1] = a[1][1];//将三角形顶部的数字赋给dp[1][1]
		for(int i=2;i<=n;i++){
			for(int j=1;j<=i;j++){
				if(j==1){
					dp[i][j] = dp[i-1][j]+a[i][j];
				}
				else{
					if(i==j){
						dp[i][j]=dp[i-1][j-1]+a[i][j];
					}else{
						dp[i][j]=Math.max(dp[i-1][j-1], dp[i-1][j])+a[i][j];
					}
				}
			}
		}
		int ans=0;
		for(int i=1;i<=n;i++){
			ans = Math.max(ans, dp[n][i]);
		}
		System.out.println(ans);
	}
}

  

posted @ 2020-02-24 20:13  不会投篮的邢  阅读(238)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3