解题思路:
这是动态规划的基本题目,首先确定b[j][k]是表示从[1][1](顶部)到a[j][k]所累加的最大值,而b[j][k]是从a[j-1][k]或者a[j-1][k-1]到来的,只要使用max函数确定这两个数谁大就可以确定这个点的最大值,依次类推。最后确定最底一行的最大值就是要求的值。
注意事项:
此题中的左下是正下的意思,不是左边的下方。
参考代码:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int a[101][101]={0},b[101][101]={0},i,n,m;//a[j][k]表示初始这个点的值,b[j][k]表示到这个点的最大值。
cin>>n;//n表示测试的次数
int c[n+1]={0};
for(i=1;i<=n;i++)
{
cin>>m;
for(int j=1;j<=m;j++)//输入数据
{
for(int k=1;k<=j;k++)
{
cin>>a[j][k];
}
}
for(int j=2;j<=m;j++)//注意最左边要单独计算,因为只能一直向下走要单独计算。
{
b[j][1]=a[j][1]+b[j-1][1];
}
for(int j=2;j<=m;j++)//同理最右边也要单独计算。
{
b[j][j]=b[j-1][j-1]+a[j][j];
}
for(int j=1;j<=m;j++)
{
for(int k=1;k<=j;k++)
{
b[j][k]=max(b[j-1][k]+a[j][k],b[j-1][k-1]+a[j][k]);
}
}
for(int j=1;j<=m;j++)
{
c[i]=max(c[i],b[m][j]);//将每次测试的最大值输入到数组中。
}
}
for(int i=1;i<=n;i++)
{
cout<<c[i]<<endl;
}
return 0;
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复