当前位置:网站首页>一本通1258——数字金字塔(动态规划)
一本通1258——数字金字塔(动态规划)
2022-08-09 03:02:00 【竹林居士-】
题目
原题链接
http://ybt.ssoier.cn:8088/problem_show.php?pid=1258【题目描述】
观察下面的数字金字塔。写一个程序查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以从当前点走到左下方的点也可以到达右下方的点。

在上面的样例中,从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.定义变量
const int N=1010;
int a[N][N],mk[N][N];
int n;
2.定义深搜函数
int dfs(int x,int y)
{
if(x>n) return 0;
if(mk[x][y]!=-1) return mk[x][y];
return mk[x][y]=max(dfs(x+1,y),dfs(x+1,y+1))+a[x][y];
}3.主程序
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}
memset(mk,-1,sizeof(mk));
cout<<dfs(1,1)<<endl;
return 0;
}完整代码
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int a[N][N],mk[N][N];
int n;
int dfs(int x,int y)
{
if(x>n) return 0;
if(mk[x][y]!=-1) return mk[x][y];
return mk[x][y]=max(dfs(x+1,y),dfs(x+1,y+1))+a[x][y];
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}
memset(mk,-1,sizeof(mk));
cout<<dfs(1,1)<<endl;
return 0;
}新手,请多多指教
边栏推荐
猜你喜欢
随机推荐
ARM开发(二)ARM体系结构——ARM,数据和指令类型,处理器工作模式,寄存器,状态寄存器,流水线,指令集,汇编小练习题
C专家编程 第9章 再论数组 9.7 轻松一下---软件/硬件平衡
unshift() :将一个或多个元素添加到数组的开头
C专家编程 第9章 再论数组 9.6 C语言的多维数组
【扫雷--2】
Inheritance
【物理应用】基于El-centro地震波作用下隔震与非隔震支座下的顶层位移、速度、加速度的对比情况附matlab代码
深度学习——以天气识别为例,探讨如何保存神经网络模型
Doris从理论详解到千万级数据量场景使用
对线面试官实现去重和幂等
Shell脚本:函数
整数溢出机制 C
flat() :递归地将数组展平到指定的深度
MVVM项目开发(商品管理系统二)
C专家编程 第9章 再论数组 9.5 数组和指针可交换性的总结
三箭资本濒临破产?市场陷入1907年恐慌之中?加密监管不可避免
The building had been registry cluster, load balancing
手把手教你uniapp接入聊天IM即时通讯功能-源码分享
lvs+keepalived高可用负载均衡集群
Kubernetes:(十三)secret与configmap的那些事









