题目链接:http://lx.lanqiao.cn/problem.page?gpid=T312
思路:
一开始写错了,写的是从顶至底,每次选择两个底数中较大者累加。发现错误之后再就想到列举所有情况的和再取最大值,然鹅这运算量也太大了,运行时间也会超的。没思路只好百度一下咯,艾西我怎么没想到从底至顶,之前的错误代码都不用怎么修改,换个思路就柳暗花明又一村了…所以说脑子是个好东西,可惜我没有啊…
具体解法如下:
从倒数第二行开始,将每个数与其左右两个底数中的较大值相加,同理再倒数第三行第四行…最后最顶层的值就是总和最大值。
注意:
- 二维数组,方便检索行和列 ( j<=i下三角)
- 取两数中的最大值可直接用max(a,b)
- 脑子是个好东西,可惜我没有啊…
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int num[100][100]={0};
int n;
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<=i;j++)
cin>>num[i][j];
for(int i=n-2;i>=0;i--)
for(int j=0;j<=i;j++)
num[i][j]+=max(num[i+1][j],num[i+1][j+1]);
cout<<num[0][0]<<endl;
return 0;
}
手动分界线
后来看书更详细的归纳了一下:动态规划初步 数字三角形
https://blog.csdn.net/weixin_42324771/article/details/87275467
手动分界线
以下请无视:(最开始的错代码)
从顶至底每次选择两个底数中较大者累加:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int num[100][100]={0};
int n;
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<=i;j++)
cin>>num[i][j];
for(int i=n-2;i>=0;i--)
for(int j=0;j<=i;j++)
{
if(num[i+1][j]>num[i+1][j+1])
{
sum+=num[i+1][j];
i+=1;
}
else
{
sum+=num[i+1][j+1];
i+=1;j+=1;
}
}
cout<<sum<<endl;
return 0;
}