思路:用动态规划解决(类似于数塔问题)
(题目要求,向左下走与向右下的次数不能超过1,如果没有这个条件,那么从下往上走就容易解决了,走到三角形塔顶,那么dp[1][1]即为结果。本题采用从上往下走更方便)
1.不难发现,当n是奇数时,相差的总次数不超过一,那么最后都会走到最后一层的中间那个数,即 ans=dp[n][n/2],巧妙在这里,可自己验证。
2.当n是偶数时,可能走到最后一层的中间那两个数的其中一个,这时候只需要比较一下那个比较大,,即满足题意:
ans=Max(dp[n][n/2],dp[n][n/2+1]);
#include <iostream>
using namespace std;
int Max(int a,int b){
return a>=b?a:b;
}
int main(){
int n,ans;
cin>>n;
int dp[n+1][n+1]={0};
for(int i=1;i<=n;i++){ //输入数字三角形
for(int j=1;j<=i;j++)
cin>>dp[i][j];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++)
dp[i][j]+=Max(dp[i-1][j],dp[i-1][j-1]);
}
if(n%2==0)
ans=Max(dp[n][n/2],dp[n][n/2+1]);
else
ans=dp[n][n/2+1];
cout<<ans;
return 0;
}