b_lq_数字三角形(注意读入数据和题目描述的差异)
给出n(n<=100)层的数字三角形,每次只能往左下/右下走,求 abs(往左走次数-往右走次数)≤1 的最大权值路径和。
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出:27
思路
三角形和输入数据的形状不一样,所以往左下走变成了输入数据的往下走
而往下走的前提是上面有格子,所以往下走的状态转移前要加个判断 if (j<i)
比的时候我发现到达终点的路径总和有比27大的..,但不要忘了看图,起点是整个三角形的顶点,所以要满足左下和右下的次数不大于1的话,终点只能在底部的中间位置(n为偶数时,答案为max(f[n/2-1], f[n/2]);n为奇数时,答案为 f[n/2])
#include<bits/stdc++.h>
using namespace std;
const int N=105;
int n,g[N][N],f[N][N];
int main() {
std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin>>n;
for (int i=1; i<=n; i++)
for (int j=1; j<=i; j++)
cin>>g[i][j];
for (int i=1; i<=n; i++)
for (int j=1; j<=i; j++) {
if (j<i) f[i][j]=max(f[i][j], f[i-1][j]+g[i][j]); //每行的最后一列的状态不能从上一行往下走转移过来
f[i][j]=max(f[i][j], f[i-1][j-1]+g[i][j]);
}
if (n&1) cout<<f[n][n/2+1];
else cout<<max(f[n][n/2], f[n][n/2+1]);
return 0;
}