一、题目研究
1.原题
【题目描述】
如下所示的由正整数数字构成的三角形:
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
2.读题
原题中说要从三角形顶部走到底部,很明显是个动态规划问题,那 么我们来看看状态转移方程是什么:
因为是只能往正下方或右下方走,所以所在位置的状态转移方程就应该是取正下方与右下方两个值比较出来较大的值再加上所在位置的值。
因此 美丽而又优雅 的状态转移方程就是:
f[i][j]=a[i][j]+max(f[i+1][j],f[i+1][j+1]);
注意: 最顶端和最左边不用比较,但需要表示,不漏不重
二、代码给出
注意:这里给出的仅是本蒟蒻个人“乐色(辣鸡)”代码,仅供参考,严禁抄袭!!!
#include <bits/stdc++.h> //可爱的万能头文件
using namespace std;
long long n,a[105][105],f[105][105]; //定义数组a为点值,f为最大加值
int main()
{
cin>>n; //首先输入三角形高度
for (int i=1;i<=n;i++)
{
for (int j=1;j<=i;j++)
{
cin>>a[i][j]; //接下来依次输入点值
}
}
for (int i=1;i<=n;i++)
{
f[n][i]=a[n][i]; //因为最底层的最大加值就是该点点值,所以直接赋值
}
for (int i=n-1;i>=1;i--)
{
for (int j=1;j<=i;j++)
{
f[i][j]=a[i][j]+max(f[i+1][j],f[i+1][j+1]); //状态转移方程的应用
}
}
cout<<f[1][1]; //输出最高点
return 0;
}
三、总结与感谢
1.总结:
这是本蒟蒻第一次写题解,如有不懂,可以私信问我,如若题解存在问题甚至错误,请及时向我沟通,我会第一时间改正,希望这篇题解对各位奆佬有用!!!
2.感谢:
感谢大家看我的第一篇题解,请高抬贵手留下你们珍贵的赞,我也不奢望你们关注我,但我会继续努力,争取日更!!!