动态规划——三角形问题

有如下一个数字三角形:


 3 8
 8 1 0
 2 7 4 4
 4 5 2 6 5

从定点出发,在每个节点可以选择向下走或者向右下走,一直走到底层。试设计一种算法,计算从三角形顶端到底部的一条路径,是该路径经过的数字总和最大

 1 #include<iostream>
 2 #include<algorithm>
 3 #define NUM 101
 4 int main()
 5 {
 6     using namespace std;
 7     int n, d[NUM][NUM], *maxsum;//表示n行的数字三角形,用d数组来存放数字.
 8         cin >> n;
 9     for (int i = 1; i <= n; i++)
10         for (int j = 1; j <= i; j++)
11             cin >> d[i][j];
12     maxsum = d[n];//maxsum指针指向第n行
13     for (int i = n - 1; i >= 1; --i)
14         for (int j = 1; j <= i; ++j)
15             maxsum[j] = max(maxsum[j], maxsum[j + 1]) + d[i][j];
16     cout << maxsum[1]<< endl;
17     return 0;
18 }

---恢复内容结束---

时间: 2024-10-11 21:52:05

动态规划——三角形问题的相关文章

[动态规划]数字三角形

动态规划一直是一个很头疼的问题啊. 最近在看这方面的东西,记录一下刘汝佳书里的动态规划章节里的数字三角形题目. 这道题很基础,但总结的三个动态规划很清晰. 有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有一个数,形如: 1 3 2 4 10 1 4 3 2 20 每个结点都可到它左右子结点,例如3可以到4也可以到10. 从第一行开始每次可以往左下或右下走一格,直到走到最下,把沿途结点的值相加,如何走才能得到最大值. 如果遍历的话,n层会有2的n次方种可能性

动态规划--数字三角形问题

1. 问题描述 有一个像这样的数字三角形: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 从顶点开始,每个数字向下层走只能有左下和右下两个方向,求出到达最后一行时最大的路径之和. Input 第1 行是数字三角形的行数n,1<= n <=100. 接下来n行是数字三角形各行中的数字.所有数字在0---99之间. 比如Input是: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 则output是30. 2. 问题求解 这是一个典型的动态规划求解问题,因为它符合动态

动态三角形(动态规划思想入门)

个人心得:动态规划是一种隶属于决策学的一个算法思想,他能够很好的解决多阶段决策问题,这种思想对于我们的生活还是科研都是必不可少的, 需要好生体会,学会动态方程的转移,做到具体问题具体分析. 那这简单题目来看吧,动态三角形,很明显从第一个开始就可以看出来第一个等于下面俩个对角线中最大与自己相加,所以可以用递归完成, 当然还有种更加巧妙的就是从后面往前面走,你可以很明显看到从倒数第二行开始他的最大值应该等于下俩个对角线中的最大值加上自己本身. 所以方程可以这么表示 DP[i][j]=max(DP[i

动态规划 数字三角形(递归,递推,记忆化搜索)

题目要求: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的数字三角形中寻找在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或右下走.只需要求出这个最大和即可,不必给出具体路径. 三角形的行数大于1小于等于100,数字为 0 - 99 输入格式: 5 //三角形行数.下面是三角形 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 解题思路: 用二维数组存放数字三角形 D[r][j] //表示第i行第j个元素的

动态规划入门-数字三角形(从朴素递归到各种优化)

数字三角形(POJ1163) Description 73 88 1 02 7 4 44 5 2 6 5 在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或右下走.只需要求出这个最大和即可,不必给出具体路径.三角形的行数大于1小于等于100,数字为 0 - 99 输入格式:5 //三角形行数.下面是三角形73 88 1 02 7 4 4 4 5 2 6 5 要求输出最大和 Sample Output 30 Source IOI 1994

#动态规划 LeetCode 120 三角形最小路径和

给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11). 说明: 如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分. 思路: 接着上一题的状态转移继续说 动态规划问题,重中之重就是找到状态转移方程,而状态转移方程很重要的一点就是明确函数的意义所在,以及记录结果

数字三角形,从递归到动态规划

 一.实践题目 数字三角形 给定一个由 n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. 输入格式: 输入有n+1行: 第 1 行是数字三角形的行数 n,1<=n<=100. 接下来 n行是数字三角形各行中的数字.所有数字在0..99 之间. 输出格式: 输出最大路径的值. 输入样例: 在这里给出一组输入.例如: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 输出样例: 在

【数据结构与算法】动态规划——最小路径和(普通矩阵、三角形两题)

最小路径和 LeetCode:最小路径和 题目描述: 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小. 思想: 动态规划,可以用原数组作为dp数组 代码: class Solution { public int minPathSum(int[][] grid) {

简单动态规划---动态的数字三角形

动态的数字三角形 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 一个数字组成的三角形,有n行,第i行有i个数.从第一个数开始,每次可以往左下或右下走一格,直到走到最后一行,把沿途经过的数全部加起来.如何走才能得到最大的和?    举个例子:                           为了简单起见,输入时将每行的数依次输入,第一个数之前并不输入空格. 输入 第一行:n,表示这个三角形共有n行第二至n+1行:依次为这