原题链接:数字三角形
解题思路:我们所要解决的问题不过是进行一层层的最大值判断,然后将其相加
注意事项:
参考代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int arr[1010][1010];//把arr看成上面写的g就行了
int n;
int fun(int x1,int y1)
{
if(x1>n) return 0;
else return max(fun(x1+1,y1)+arr[x1][y1],fun(x1+1,y1+1)+arr[x1][y1]);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
cin>>arr[i][j];
}
}
int fh=fun(1,1);//从第一个开始递
cout<<fh;
}
接下来是记忆化搜索的代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int arr[1010][1010];
int brr[1010][1010];/*记忆数组 ,
8
1 0
4
当1和0都递到4时,1已经记录过4后面的了,直接返回判断4的结果*/
int n;
int sum;//用sum来记录结果
int fun(int x1,int y1)
{
if(brr[x1][y1]) return brr[x1][y1];//如果出现第2个一样的,返回第一个的值;
if(x1>n) return 0;
else sum=max(fun(x1+1,y1)+arr[x1][y1],fun(x1+1,y1+1)+arr[x1][y1]);
brr[x1][y1]=sum;
return sum;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
cin>>arr[i][j];
}
}
int fh=fun(1,1);
cout<<fh;
}
接下来是递推
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int arr[1010][1010];
int brr[1010][1010];
int f[1010][1010];
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
cin>>arr[i][j];
}
}
for(int i=n;i>=1;i--)
{
for(int j=1;j<=n;j++)
{
f[i][j]=max(f[i+1][j]+arr[i][j],f[i+1][j+1]+arr[i][j]);//左下角往右上角推
}
}
cout<<f[1][1];
cout<<fh;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复