[luogu]P1216-数字三角形

本文介绍了一个通过编程解决数字金字塔路径求和问题的方法。该问题要求找出从金字塔顶部到底部路径上的数字之和的最大值,每一步可以走到左下方或右下方。文章提供了一段C++代码实现,采用动态规划思想逆向计算各节点的最大路径和。

题目描述

观察下面的数字金字塔。

写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。

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

在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大

输入输出格式

输入格式:

第一个行包含 R(1<= R<=1000) ,表示行的数目。

后面每行为这个数字金字塔特定行包含的整数。

所有的被供应的整数是非负的且不大于100。

输出格式:

单独的一行,包含那个可能得到的最大的和。

输入输出样例

输入样例
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5 
输出样例
30
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=1005;


int n;int ans;
int	a[maxn][maxn];
int summax[maxn][maxn];


int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=i;j++){
			scanf("%d",&a[i][j]);
		}
	}
	
	for(int i=1;i<=n;i++)	summax[n][i]=a[n][i];
	for(int i=n-1;i>=1;i--){
		for(int j=1;j<=i;j++){
			summax[i][j]=max(summax[i+1][j],summax[i+1][j+1])+a[i][j];
		}
	}
	
	ans=summax[1][1];
	printf("%d\n",ans);
	return 0;
} 


![](https://cdn.luogu.com.cn/upload/image_hosting/undefined.png) 根据你的反馈,程序在运行时提示: ``` 错误:输入的值必须为数字! ``` 这说明程序检测到用户输入了**非数字内容**,例如 `*`、字母或其他非法字符,导致无法正常转换为浮点数。 --- ### 原因分析 - 程序期望接收三个合法的**浮点数**作为三角形的边长。 - 但实际输入中可能包含如下内容: - 字符串如 `"abc"`、`"*"`、`"end"` 等 - 缺少输入 - 输入格式不规范(如带空格、换行) --- ### 示例错误输入 比如输入如下内容: ``` 3.0 * 5.0 ``` 程序在读取第二个输入时,会尝试执行: ```python b = float('*') ``` 这将引发 `ValueError`,并被捕获为“错误:输入的值必须为数字!” --- ### 如何避免错误 1. **确保输入合法数字**:只输入形如 `3.0`、`4`、`5.5` 等合法数字。 2. **程序改进方向**: - 使用循环输入验证机制 - 自动忽略非法输入或提示用户重新输入 --- ### 改进后的程序(支持输入验证) ```python import math def get_float_input(prompt): while True: try: value = float(input(prompt).strip()) return value except ValueError: print("输入无效,请输入一个合法的数字!") # 获取三边长 a = get_float_input("请输入第一条边长:") b = get_float_input("请输入第二条边长:") c = get_float_input("请输入第三条边长:") # 判断是否能构成三角形 if a + b <= c or a + c <= b or b + c <= a: print("错误:输入的三个边长不能构成一个三角形!") else: p = (a + b + c) / 2 area = math.sqrt(p * (p - a) * (p - b) * (p - c)) print(f"三角形的面积为:{area:.2f}") ``` --- ### 功能说明 - **函数 `get_float_input()`**:持续提示用户直到输入合法的浮点数。 - **增强鲁棒性**:防止程序因非法输入崩溃,适用于自动评测或用户交互场景。 --- ### 知识点(列出该代码中遇到的知识点) - **异常处理**:使用 `try-except` 捕获 `ValueError` 防止程序崩溃。 - **输入验证机制**:循环获取输入,确保数据合法性。 - **类型转换与浮点数处理**:使用 `float()` 转换合法数字字符串。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值