poj1163(数字三角形)

作者: sugar_coated | 来源:发表于2016-09-09 18:05 被阅读148次

问题描述

有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有一个数,如下图。从第一行的数开始,每次可以往左下或右下走一格,直到走到最下行,把沿途经过的数全部加起来。如何走才能使得这个和尽量大,输出最大和。

Paste_Image.png

如:


Paste_Image.png

这是一个数字三角形问题,可以用记忆化搜索,也可以用递推。
首先由题意可以得到状态转移方程:d[i][j] = tri[i][j] + max(d[i + 1][j], d[i + 1][j + 1]);d[i][j] 为从 tri[i][j] 出发时(包括 tri[i][j])能得到的最大和。
记忆化搜索

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int MAX_N = 100 + 5;
int d[MAX_N][MAX_N];
int tri[MAX_N][MAX_N];//三角形的值
int n;

int solve(int i, int j) {
    if (d[i][j] >= 0) return d[i][j];
    return d[i][j] = tri[i][j] + (i == n - 1 ? 0 : max(solve(i + 1, j), solve(i + 1, j + 1)));
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    memset(d, -1, sizeof(d));//为了防止某个值被重复计算
    cin >> n;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j <= i; ++j)
            cin >> tri[i][j];
    }
    solve(0, 0);
    cout << d[0][0] << endl;
}```
**递推**

include <iostream>

include <algorithm>

using namespace std;

const int MAX_N = 100 + 5;
int d[MAX_N][MAX_N];
int tri[MAX_N][MAX_N];//简单一点可以不要这个数字,此处为了说明问题

void solve(int n) {
for (int j = 0; j <= n - 1; ++j)
d[n - 1][j] = tri[n - 1][j];//不写tri[i][j]时,就不需要这一步了
for (int i = n - 2; i >= 0; --i) {
for (int j = 0; j <= i; ++j)
d[i][j] = tri[i][j] + max(d[i + 1][j], d[i + 1][j + 1]);
//d[i][j] += max(d[i + 1][j], d[i + 1][j + 1]);//不用tri[i][j]时
}
}

int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
for (int j = 0; j <= i; ++j)
cin >> tri[i][j];//cin >> d[i][j];
}
solve(n);
cout << d[0][0] << endl;
}```
这两种方法的时间复杂度都是o(n * n)。用递推计算的时候需要注意边界问题和计算顺序。采用记忆化搜索时,不必事先确定各状态的计算顺序,但需要记录每个状态“是否已经计算过”。

相关文章

  • poj1163(数字三角形)

    问题描述 有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有一个数,如下图。...

  • poj1163

    这是一道动态规划的题目 如果我知道第0-i层的最大值,那么第i+1层的最大值显然了,但是这样不怎么好处理,下面我把...

  • Leetcode 120.Triangle

    这道题的大概意思是,给一个数字构成的三角形,要求找出一条路径使得路径数字之和最小。 比如下面这个三角形的数字和最小...

  • DP(dynamic programming)

    以数字三角形为例:给出一个数字三角形,从顶部到底部有很多路径,求路径最大和。如: 73 88 1 02...

  • 动态规划 2020-03-17

    动态规划 动态规划重要的是:判断状态,状态转移方程 数字三角形 问题描述给定一个数字三角形,找到从顶部到底部的最小...

  • 109. 数字三角形

    109. 数字三角形 描述 笔记 数据 评测 给定一个数字三角形,找到从顶部到底部的最小路径和。每一步可以移动到下...

  • 动态规划数字三角形

    给定一个由n行数字组成的数字三角形,设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。输...

  • 烧脑题1

    移动3个圆圈, 把左边的三角形变成右边的三角形, 该怎么做呢? 答案: 假设10个三角形是1到10的数字,那么就该...

  • 线性dp

    数字三角形 原题链接[https://www.acwing.com/problem/content/900/] 一...

  • 动规入门 - 数字三角形(从朴素递归到递推的四步优化)

    问题:给定一个由n行数字组成的数字三角形,如下图所示: 试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径...

网友评论

    本文标题:poj1163(数字三角形)

    本文链接:https://www.haomeiwen.com/subject/iaoeettx.html