美文网首页动态规划
hihiocoder1037 数字三角形

hihiocoder1037 数字三角形

作者: 科学旅行者 | 来源:发表于2017-01-17 17:18 被阅读7次

题目:

时间限制:10000ms
单点时限:1000ms
内存限制:256MB
问题描述
小Hi和小Ho在经历了螃蟹先生的任务之后被奖励了一次出国旅游的机会,于是他们来到了大洋彼岸的美国。美国人民的生活非常有意思,经常会有形形色色、奇奇怪怪的活动举办,这不,小Hi和小Ho刚刚下飞机,就赶上了当地的迷宫节活动。迷宫节里展览出来的迷宫都特别的有意思,但是小Ho却相中了一个其实并不怎么像迷宫的迷宫——因为这个迷宫的奖励非常丰富~
于是小Ho找到了小Hi,让小Hi帮助他获取尽可能多的奖品,小Hi把手一伸道:“迷宫的介绍拿来!”
小Ho选择的迷宫是一个被称为“数字三角形”的n(n不超过200)层迷宫,这个迷宫的第i层有i个房间,分别编号为1..i。除去最后一层的房间,每一个房间都会有一些通往下一层的房间的楼梯,用符号来表示的话,就是从第i层的编号为j的房间出发会有两条路,一条通向第i+1层的编号为j的房间,另一条会通向第i+1层的编号为j+1的房间,而最后一层的所有房间都只有一条离开迷宫的道路。这样的道路都是单向的,也就是说当沿着这些道路前往下一层的房间或者离开迷宫之后,小Ho没有办法再次回到这个房间。迷宫里同时只会有一个参与者,而在每个参与者进入这个迷宫的时候,每个房间里都会生成一定数量的奖券,这些奖券可以在通过迷宫之后兑换各种奖品。小Ho的起点在第1层的编号为1的房间,现在小Ho悄悄向其他参与者弄清楚了每个房间里的奖券数量,希望小Hi帮他计算出他最多能获得多少奖券。
提示一:盲目贪心不可取,搜索计算太耗时
提示二:记忆深搜逞神威,宽度优先解难题
提示三:总结归纳提公式,减少冗余是真理
输入
每个测试点(输入文件)有且仅有一组测试数据。
每组测试数据的第一行为一个正整数n,表示这个迷宫的层数。
接下来的n行描述这个迷宫中每个房间的奖券数,其中第i行的第j个数代表着迷宫第i层的编号为j的房间中的奖券数量。
测试数据保证,有100%的数据满足n不超过100
对于100%的数据,迷宫的层数n不超过100
对于100%的数据,每个房间中的奖券数不超过1000
对于50%的数据,迷宫的层数不超过15(小Ho表示2^15才3万多呢,也就是说……)
对于10%的数据,迷宫的层数不超过1(小Hi很好奇你的边界情况处理的如何?~)
对于10%的数据,迷宫的构造满足:对于90%以上的结点,左边道路通向的房间中的奖券数比右边道路通向的房间中的奖券数要多。
对于10%的数据,迷宫的构造满足:对于90%以上的结点,左边道路通向的房间中的奖券数比右边道路通向的房间中的奖券数要少。
输出
对于每组测试数据,输出一个整数Ans,表示小Ho可以获得的最多奖券数。
样例输入
5
2
6 4
1 2 8
4 0 9 6
6 5 5 3 6
样例输出
28

这道题是数字三角形问题,可以用动态规划的方法解决。
从每一个点(最后一行除外)到下一行的走法有两种,假设该点为第i行第j列,则可以走到第i+1行第j列或者第i+1行第j+1列。如果暴力的话肯定过不了。但是我们可以发现第i行第j列到底端的数字之和取决于当前第i行第j列的值以及第i+1行第j列到底端的数字之和和第i+1行第j+1列到底端的数字之和。因此我们可以得到一个状态转移方程式:
dp[i][j] = num[i][j] + max(dp[i+1][j], dp[i+1][j+1]);
最终的结果就是dp[1][1].

参考代码:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100+5;

int mp[N][N];
int dp[N][N];//第i行第j个数到底端的数字之和的最大值;

void input(const int n) {
    for (int i = 1;i <= n;++i) {
        for (int j = 1;j <= i;++j) {
            cin >> mp[i][j];
        }
    }
}

int numtri(const int n) {//数字三角形 动态规划;
    for (int j = 1;j <= n;++j) {//从最后一层开始向上递推;
        dp[n][j] = mp[n][j];
    }

    for (int i = n-1;i >= 1;--i) {
        for (int j = 1;j <= i;++j) {
            dp[i][j] = mp[i][j] + max(dp[i+1][j], dp[i+1][j+1]);
        }
    }

    return dp[1][1];
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int n;
    cin >> n;
    input(n);

    int ans = numtri(n);
    cout << ans << endl;
    return 0;
}

相关文章

  • hihiocoder1037 数字三角形

    题目: 时间限制:10000ms单点时限:1000ms内存限制:256MB问题描述小Hi和小Ho在经历了螃蟹先生的...

  • 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行数字组成的数字三角形,如下图所示: 试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径...

  • 数字笔记,2

    数字三角形内有2的人,不仅善于沟通,而且能够说到对方的心里去。 三角形里面没有2,外面有2 。婚前2在外面,能说;...

网友评论

    本文标题:hihiocoder1037 数字三角形

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