当前位置:网站首页>信息学奥赛一本通(1258:【例9.2】数字金字塔)
信息学奥赛一本通(1258:【例9.2】数字金字塔)
2022-08-02 20:02:00 【橙子教师】
1258:【例9.2】数字金字塔
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 20019 通过数: 11518
【题目描述】
观察下面的数字金字塔。写一个程序查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以从当前点走到左下方的点也可以到达右下方的点。
在上面的样例中,从13到8到26到15到24的路径产生了最大的和86。
【输入】
第一个行包含R(1≤R≤1000),表示行的数目。
后面每行为这个数字金字塔特定行包含的整数。
所有的被供应的整数是非负的且不大于100。
【输出】
单独的一行,包含那个可能得到的最大的和。
【输入样例】
5
13
11 8
12 7 26
6 14 15 8
12 7 13 24 11
【输出样例】
86
【分析】
方法1:顺推
设a[i][j]存储数塔,f[i][j]则记录从起点到第 i 层第 j 列的路径数字和。
(1)划分阶段。
阶段:每一层就是一个阶段;样例中共有五个阶段。
(2)确定状态和状态变量。
状态:二维数组中的每个值就是状态。状态信息用f[i][j]表示。
(2)确定决策并写出状态转移方程。
f[i][j]的值从哪来?当然是从上面第 i-1 行的第 j 列和第 j-1 列来。决策:来自上? 或是 来自左上?,策略:最大化路径。故:
状态转移方程:
(4)寻找边界条件。
顺推时, 边界:f[1][1]=a[1][1]。目标:max(f[n][j])
(5)设计并实现程序。
【参考代码1】
#include <stdio.h>
#define MAXN 1010
int a[MAXN][MAXN]; //存储数塔数据
int f[MAXN][MAXN]; //f[i][j]表示从起点到i层j列的路径数字和
int max(int x,int y)
{
return x > y ? x : y;
}
int main()
{
int i,j,n,ans;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
scanf("%d",&a[i][j]);
f[1][1]=a[1][1];
for(i=2;i<=n;i++)
for(j=1;j<=i;j++)
f[i][j]=max(f[i-1][j-1],f[i-1][j])+a[i][j]; //状态转移方程
ans=0;
for(i=1;i<=n;i++) //max(f[n][j])
ans=max(ans,f[n][i]);
printf("%d",ans);
return 0;
}
方法2:逆推法
逆推时,f[i][j]的值从哪来?是从下面第 i+1 行的第 j 列和第 j+1 列来。状态转移方程为:
边界:f[n][j]=a[n][j]。目标:f[1][1]。
【参考代码2】
#include <stdio.h>
#define MAXN 1010
int a[MAXN][MAXN]; //存储数塔数据
int f[MAXN][MAXN]; //f[i][j]表示从起点到i层j列的路径数字和
int max(int x,int y)
{
return x > y ? x : y;
}
int main()
{
int i,j,n;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
scanf("%d",&a[i][j]);
for(i=1;i<=n;i++)
f[n][i]=a[n][i];
for(i=n-1;i>=1;i--)
for(j=1;j<=i;j++)
f[i][j]=max(f[i+1][j],f[i+1][j+1])+a[i][j]; //状态转移方程
printf("%d",f[1][1]); //目标 f[1][1]
return 0;
}
边栏推荐
- Redis 5 种数据结构及对应使用场景
- Mysql安装流程 【压缩版】
- SQL Server安装教程
- MySQL安装配置教程(超级详细)
- 软考 ----- UML设计与分析(下)
- Leetcode刷题——字符串相加相关题目(415. 字符串相加、面试题 02.05. 链表求和、2. 两数相加)
- 【软件工程导论】软件工程导论笔记
- The so-called fighting skill again gao also afraid of the chopper - partition, depots, table, and the merits of the distributed
- postgresql autovaccum自动清理
- shell:条件语句
猜你喜欢
Thread线程类基本使用(下)
You want the metagenomics - microbiome knowledge in all the (2022.8)
OP-5,输入/输出信号范围-一信号处理能力
Fiddle设置接口数据用指定工具查看;Sublime Text设置json数据格式化转换
GNN教程:图神经网络基础知识!
Implement fashion_minst clothing image classification
Lvm逻辑卷
Caldera(一)配置完成的虚拟机镜像及admin身份简单使用
解析List接口中的常用的被实现子类重写的方法
pytorch的tensor创建和操作记录
随机推荐
Caldera(二)高级实战
Solve the docker mysql can't write Chinese
谷歌竞价机器学习如何去理解?
ImageNet下载及处理
Flutter with internationalized adapter automatically generated
一次线上事故,我顿悟了异步的精髓
SQL 嵌套 N 层太长太难写怎么办?
Geoip2 - golang golang source code analysis
leetcode刷题记录:7.整数反转,8.字符串转整数,9.回文数
B站HR对面试者声称其核心用户都是生活中的Loser
ECCV 2022 | 通往数据高效的Transformer目标检测器
【StoneDB性能相关工具】内存监控
You want the metagenomics - microbiome knowledge in all the (2022.8)
Redis集群配置
基于 outline 实现头像剪裁以及预览
LeetCode - 105. 从前序与中序遍历序列构造二叉树;023.合并K个升序链表
OP-5,输入/输出信号范围-一信号处理能力
Electron User Guide Beginning Experience
Flutter自带国际化适配自动生成方案
EasyExcel dynamic parsing and save table columns