动态规划!!
首先用dp数组存一下三角形:
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cin>>dp[i][j];
1. 题目要求的是 只能选择左边或右边,找出一条所有数字和最大的路径。
那么状态转移方程便是当前一层的值加上上一层左边或右边的最大值的那个值,代码如下所示。
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
dp[i][j]+=max(dp[i-1][j-1],dp[i-1][j]);
2.题目要求向左下走的次数与向右下走的次数相差不能超过 1。
(无论怎么走,最后一层的结果永远都会有向左下走的次数与向右下走的次数相差不能超过 1的,试想一下从 三角形的顶部 走到 三角形底边 靠近中点的那个点 的 路径)
于是这样想的话,就可以直接计数他是怎么走的,用c数组记录。【注意三角形顶点不需要左右走的计数!!】
for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++){
dp[i][j]+=max(dp[i-1][j-1],dp[i-1][j]);
if(dp[i-1][j-1]>dp[i-1][j])c[i][j]=c[i-1][j-1]-1;
else if (dp[i-1][j-1]<=dp[i-1][j])c[i][j]=c[i-1][j]+1;
}
3.按题目要求输出答案
long long maxx=0;
for(int i=1;i<=n;i++){
if(abs(c[n][i])<=1)
maxx=max(dp[n][i],maxx);
}
cout<<maxx;