【移动类DP】The Triangle 数字三角形

这是一篇关于计算数字三角形中从顶部到底部最高路径和的问题,属于移动类动态规划问题。给定一个包含100行以下且大于1行的数字三角形,每行包含多个0到99之间的整数,目标是从顶部开始,每次向下或向右下移动,求经过数字之和的最大值。输入包括三角形的行数及数字,输出为最大路径和。解决方案涉及动态规划,状态转移方程为dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + a[i][j]。" 103515977,7242844,2019年异质图神经网络顶会论文解析,"['图神经网络', '数据挖掘', '自然语言处理', '推荐系统', '网络安全']
摘要由CSDN通过智能技术生成

Description

7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(Figure 1)

Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed 
on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally 
down to the left or diagonally down to the right.
给出一个数字三角形,你从[1,1]开始出发,走到最后一行。每次站在一个点上时,可以向下走,或者向右下走。
将经过的数字加起来,希望其和最大。

Input

The first line contains one integer N: the number of rows in the triangle. 
The following N lines describe the data of the triangle. 
The number of rows in the triangle is > 1 but <= 100. 
The numbers in the triangle, all integers, are between 0 and 99.

Output

Your program is to write to standard output. The highest sum is written as an integer.

Sample Input</

Sure! Here's the UML diagram for the Triangle and GeometricObject classes: ``` --------------------- -------------------- | GeometricObject | | Triangle | --------------------- -------------------- |+color: String | |-side1: double | |+filled: boolean | |-side2: double | |+GeometricObject() | |-side3: double | |+GeometricObject(color: String, filled: boolean)| |-Triangle(side1: double, side2: double, side3: double)| |+getColor(): String | |+getSide1(): double| |+setColor(color: String): void| |+getSide2(): double| |+isFilled(): boolean | |+getSide3(): double| |+setFilled(filled: boolean): void| |+getArea(): double| |+getPerimeter(): double| |+getPerimeter(): double| |+toString(): String | |+toString(): String| --------------------- -------------------- ``` And here's the implementation of the Triangle class: ```java public class Triangle extends GeometricObject { private double side1, side2, side3; public Triangle(double side1, double side2, double side3) { this.side1 = side1; this.side2 = side2; this.side3 = side3; } public double getSide1() { return side1; } public double getSide2() { return side2; } public double getSide3() { return side3; } public double getArea() { double s = (side1 + side2 + side3) / 2; return Math.sqrt(s * (s - side1) * (s - side2) * (s - side3)); } public double getPerimeter() { return side1 + side2 + side3; } public String toString() { return "Triangle: side1 = " + side1 + " side2 = " + side2 + " side3 = " + side3; } } ``` And here's the test program: ```java import java.util.Scanner; public class TestTriangle { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("Enter three sides of the triangle: "); double side1 = input.nextDouble(); double side2 = input.nextDouble(); double side3 = input.nextDouble(); System.out.print("Enter a color: "); String color = input.next(); System.out.print("Is the triangle filled (true/false)? "); boolean filled = input.nextBoolean(); Triangle triangle = new Triangle(side1, side2, side3); triangle.setColor(color); triangle.setFilled(filled); System.out.println("Area: " + triangle.getArea()); System.out.println("Perimeter: " + triangle.getPerimeter()); System.out.println("Color: " + triangle.getColor()); System.out.println("Filled: " + triangle.isFilled()); } } ``` Hope that helps! Let me know if you have any other questions.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值