SDUT 1730 数字三角形问题

本文介绍了一种解决数字三角形问题的方法,通过从底部向上逆向求解的方式找到从顶部到底部路径上数字和的最大值。这种方法避免了从顶部开始时路径选择的指数级增长,确保了最终结果为最优解。

1.题目

数字三角形问题
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。

对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底的路径经过的数字和的最大值。
Input
输入数据的第1行是数字三角形的行数n,1≤n≤100。接下来n行是数字三角形各行中的数字。所有数字在0..99之间。
Output
输出数据只有一个整数,表示计算出的最大值。
Sample Input

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

Sample Output

30

2.正确代码

#include <iostream>

using namespace std;

int main()
{

    int n;
    int arr[101][101],i,j;


    while(cin >> n)
    {

        for(i=1;i<=n;i++)
            for(j=1;j<=i;j++)
                cin >> arr[i][j];


        for(i=n-1;i>=1;i--)
            for(j=1;j<=i;j++)
                arr[i][j]+=arr[i+1][j]>arr[i+1][j+1]?arr[i+1][j]:arr[i+1][j+1];

        cout << arr[1][1] << endl;



    }
}

3.代码解读:

1.这个题目代码不是问题,单看这个题的思路也不是问题,但我们如何来看待这一类问题呢?
2.按常理,是从前往后把每种可能写起来,但为什么不能从前往后推呢?我们也可以把结果存起来啊?
3.我们现在就来思考这个问题,为什么不能从前往后推,是什么原因导致的?
4.因为,从前往后,我们所要面临的选择越来越多,如1->2,本来由一个,这样会推导出两种可能,这两种都有可能是最优解,这样随着进行下去,我们所面临的选择越来越多,最优解的潜在可能也越来越多,这算法自然很劣势。
5.但如果你从后往前推,那么可能性是越来越小的,即你最优解可以选择的范围越来越小,并且最后推到时必然是最优解,可以,你又会问,你如何能证明这个是最优解?这个题目性质本身就是纯数值的积累,不存在路径弯道之类的,故,每个值最大,那么结果一定最大。
6.那么以后什么问题都用这种不是都可行吗?当然不行,不仅每次选择的条件,还有一个重要的,这里“最后”的数值即确定了,即结尾一定确定,数据都出来了,不存在其他的未知数据。
7.所以,当以后数据都已给出,注意,从大可能往小可能方向查找,而非倒过来,很简单。

编程题 10 3 sdut-顺序结构-1 利用海伦公式求三角形面积,了解世界科学史 3 sdut-顺序结构-1 利用海伦公式求三角形面积,了解世界科学史 分数 10 作者 周雪芹 单位 山东理工大学 背景: 海伦公式又译作希伦公式、海龙公式、希罗公式、海伦—秦九韶公式。它是利用三角形的三条边的边长直接求三角形面积的公式。它的特点是形式漂亮,便于记忆。 相传这个公式最早是由古希腊数学家阿基米德得出的,而因为这个公式最早出现在海伦的著作《测地术》中,所以被称为海伦公式。 中国秦九韶也得出了类似的公式,称三斜求积术。 海伦公式的表示: 假设在平面内,有一个三角形,边长分别为a、b、c,三角形的面积S可由以下公式求得: 0.jpg 其中,p为半周长(即:周长的一半): 1.jpg 提示: 平方根的求解方式: (1)在Java语言中,调用Math类的静态方法sqrt(double d),返回一个double数据类型的值; (2)在C语言中, 头文件:#include <math.h> ,sqrt() 函数用来求给定值的平方根,其原型为: double sqrt(double x); (3)在Python语言中,导入 math 模块:import math,通过静态对象调用方法sqrt(),形式为:math.sqrt( x )。 输入格式: 输入若干行。每行有3个数值。 输出格式: 对于每一行输入,有一行输出。 若三个数值能够构成三角形的边,则计算它的面积,保留2位小数;如果不能构造三角形,则输出“Input Error!"。 输入样例: 3 4 5.0 1 2 3.0 -3 0 -2 输出样例: 6.00 Input Error! Input Error! 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB Java
最新发布
03-15
这是一个经典的编程题目,要求我们用 Java 实现基于海伦公式的三角形面积计算。以下是完整的解决方案及说明: ### **问题解析** #### 输入条件: 1. 每组输入包含三个正数 `a`、`b` 和 `c`。 2. 需判断这三边是否能组成有效的三角形(任意两边之和大于第三边)。 条件: ``` a + b > c && a + c > b && b + c > a ``` #### 计算公式: 若满足构成三角形的条件,则使用海伦公式计算面积: ``` p = (a + b + c) / 2; area = Math.sqrt(p * (p - a) * (p - b) * (p - c)); ``` 否则输出 `"Input Error!"`。 --- ### **Java 解决方案** ```java import java.util.Scanner; public class HelenFormula { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { // 获取用户输入并转化为浮点型变量 double a = scanner.nextDouble(); double b = scanner.nextDouble(); double c = scanner.nextDouble(); if (!isValidTriangle(a, b, c)) { // 判断是否为有效三角形 System.out.println("Input Error!"); } else { // 使用海伦公式计算面积 double p = (a + b + c) / 2; // 半周长 double area = Math.sqrt(p * (p - a) * (p - b) * (p - c)); // 海伦公式 // 输出结果保留两位小数 System.out.printf("%.2f\n", area); } } scanner.close(); // 关闭扫描仪 } /** * 判断是否为有效三角形 */ private static boolean isValidTriangle(double a, double b, double c) { return a > 0 && b > 0 && c > 0 && a + b > c && a + c > b && b + c > a; } } ``` --- ### **测试示例** #### 输入: ``` 3 4 5.0 1 2 3.0 -3 0 -2 ``` #### 输出: ``` 6.00 Input Error! Input Error! ``` --- ### **代码解释** 1. **主循环部分**: - 使用 `Scanner` 对象逐行读取输入内容。 - 将每行分为三个双精度数字进行存储。 2. **判断有效性**: - 调用辅助函数 `isValidTriangle()` 根据几何约束检查输入数据是否合法。 3. **海伦公式运算**: - 若输入有效,则依次计算半周长 `p` 和面积 `area`。 - 最终采用 `System.out.printf("%.2f\n", area)` 精确到小数点后两位输出。 4. **错误处理**: - 当任一边小于等于零或无法满足三角形成立条件时,打印 "Input Error!"。 --- ### **注意要点** - 输入需要严格按照空格分隔。 - 双精度浮点数可能存在舍入误差,在实际应用中需要注意精度控制。 - 打印格式需严格遵循 `.2f` 的规定以确保正确的显示效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值