USACO 1.6.1 数字三角形

1.6.1 数字三角形

题目考查

递推

我们考虑当选择路径的时候, 如果我们从上往下看, 最终的路径数会有 n n n种, 分别以 a [ n ] [ 1 ] a[n][1] a[n][1]~ a [ n ] [ n ] a[n][n] a[n][n]作为路径的终点.

但是如果我们从下往上去看, 最终路径只会有 1 1 1种, 即 a [ 1 ] [ 1 ] a[1][1] a[1][1].

那么如果我们以这种思路去思考, 对于 a [ i ] [ j ] a[i][j] a[i][j], 相当于我可以从 a [ i + 1 ] [ j ] a[i + 1][j] a[i+1][j] a [ i + 1 ] [ j + 1 ] a[i + 1][j + 1] a[i+1][j+1]两个数中选择一个数字, 加到 a [ i ] [ j ] a[i][j] a[i][j]中. 很显然, 最终 a [ i ] [ j ] + = m a x ( a [ i + 1 ] [ j ] , a [ i + 1 ] [ j + 1 ] ) a[i][j] += max(a[i + 1][j], a[i + 1][j + 1]) a[i][j]+=max(a[i+1][j],a[i+1][j+1]).

题目细节

  1. 如果本题作为多组输入, 一定要注意初始化.

AC代码

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
using namespace std;
const int N = 5E2 + 10;
int a[N][N];
int main()
{
    int n; cin >> n;
    rep(i, n) rep(j, i) scanf("%d", &a[i][j]);

    for (int i = n - 1; i >= 1; --i) {
    	for (int j = 1; j <= n; ++j) {
    		a[i][j] += max(a[i + 1][j], a[i + 1][j + 1]);
    	}
    }
    cout << a[1][1] << endl;
    
    return 0;
}

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逍遥Fau

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值