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;
}
原文地址:https://www.cnblogs.com/wdt1/p/13833926.html