数字金字塔,要求计算从最高点到底部任意处结束路径的最大和。
采用从下向上加的思考方法
输出:11 解释:如下面简图所示: 2 3 4 6 5 7 4 1 8 3 自顶向下的最大路径和为 21(即,2 + 4 + 7 + 8 = 21)。
递归法
#include <iostream>
using namespace std;
int n;
const int maxn=1005;
int a[maxn][maxn];
int dfs(int i,int j){
int count=0;
if(i==n-1)
{return a[n-1][j];
}
count=count+max(dfs(i+1,j),dfs(i+1,j+1));
return count;
}
int main(){
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<=i;j++)
{
cin>>a[i][j];
}
}
int ans;
ans=dfs(0,0)+a[0][0];
cout<<ans;
return 0;
}
要理解,假设某条最大路径经过某一点,则他肯定是由这点的值加上下一层两条路径中最大的那条路径,最后别忘了加上顶点,递归结束是底层点的值。
迭代法:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1005;
int a[maxn][maxn];
int main()
{int n;
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<=i;j++)
{
cin>>a[i][j];
}
}
for(int i=n-2;i>=0;i--)
{
for(int j=0;j<=i;j++)
{
a[i][j]+=max(a[i+1][j],a[i+1][j+1]);
}
}
cout<<a[0][0];
return 0;
}
我的评价是一样的没大区别写法不一样罢了。