1288:三角形最佳路径问题
1288:三角形最佳路径问题 |
【题目描述】
如下所示的由正整数数字构成的三角形:
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径。你的任务就是求出最佳路径上的数字之和。
注意:路径上的每一步只能从一个数走到下一层上和它最近的下边(正下方)的数或者右边(右下方)的数。
【输入】
第一行为三角形高度100≥h≥1,同时也是最底层边的数字的数目。
从第二行开始,每行为三角形相应行的数字,中间用空格分隔。
【输出】
最佳路径的长度数值。
【输入样例】
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
【输出样例】
30
【解题思路】
1.三角形的数字存放:二维数组
2.求最佳路径:
h:三角形高度
a[i][j]:第i行第j个数字
MAX(i,j):从f[i][j]到第h行的最佳路径 f[i][j]的下一步:a[i+1][j]或a[i+1][j+1]
求:MAX(1,1)
【递归】
#include<iostream>
using namespace std;
int h;//三角形高度
int a[105][105];//三角形的数字存放
int MAX(int i,int j){
if(i==h)return a[i][j];
int x=MAX(i+1,j);//正下方
int y=MAX(i+1,j+1);//右下方
return max(x,y)+a[i][j]; //选择最佳路径
}
int main(){
cin>>h;
for(int i=1;i<=h;i++){
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}
cout<<MAX(1,1);
return 0;
}
问题:重复计算,运行时间长
【动态规划】
1.记忆递归型
#include<iostream>
using namespace std;
int h;//三角形高度
int a[105][105];//三角形的数字存放
int f[105][105];//存储MAX(i,j)
int MAX(int i,int j){
if(f[i][j]!=-1)return f[i][j];//判断是否计算过
if(i==h)f[i][j]=a[i][j];
int x=MAX(i+1,j);//正下方
int y=MAX(i+1,j+1);//右下方
f[i][j]=max(x,y)+a[i][j]; //选择最佳路径
return f[i][j];
}
int main(){
cin>>h;
for(int i=1;i<=h;i++){
for(int j=1;j<=i;j++){
cin>>a[i][j];
f[i][j]=-1;//赋初始值
}
}
cout<<MAX(1,1);
return 0;
}
用数组f存储最佳路径,可以防止重复计算
2.递推
思路:
求从f[1][1]到f[i][j]的最大路径,从下层往上看,f[i][j]是由f[i-1][j]或f[i-1][j-1]得到的
状态转移方程:
#include<iostream>
using namespace std;
int h;
int a[105][105];//存储三角形
int f[105][105];//记录f[i][j]到第h行的最大路径
int ans;
int main(){
cin>>h;
for(int i=1;i<=h;i++){
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}
f[1][1]=a[1][1];
for(int i=2;i<=h;i++){
for(int j=1;j<=i;j++){
f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j];
}
}
for(int i=1;i<=h;i++){
ans=max(f[h][i],ans);
}//在最后一行找到最大路径的和
cout<<ans;
return 0;
}
自己喜欢用递推,感觉代码比较简洁,这道题的状态转移方程也比较容易想出来,整个代码是顺着下来的,不容易出错。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】