c++ 动态规划(数塔)
2019-07-23 21:32
1941 查看
c++ 动态规划(dp)
题目描述
观察下面的数塔。写一个程序查找从最高点到底部任意位置结束的路径,使路径经过数字的和最大。
每一步可以从当前点走到左下角的点,也可以到达右下角的点。
输入
5 13 11 8 12 7 26 6 14 15 8 12 7 13 24 11
输出
86
AC代码
#include <bits/stdc++.h> using namespace std; const int MAXN = 505; int dp[MAXN][MAXN],a[MAXN][MAXN]; int max(int a,int b)//max函数求两个数字之间的最大值 { return a>b?a:b; } int main() { int n; cin >> n; for (int i = 1;i <= n;i ++)//输入 { for (int j = 1;j <= i;j ++) { cin >> a[i][j]; } } dp[1][1] = a[1][1];//把起点直接放在dp[]里面 for (int i = 2;i <= n;i ++) { for (int j = 1;j <= i;j ++) { dp[i][j] = max(dp[i - 1][j - 1],dp[i - 1][j]) + a[i][j];//dp公式,原理是先走一步,然后扫描这个点的上一层的邻接点看看哪个点的dp值最大,然后用最大值加上他本身 } } int ans = 0; for (int i = 1;i <= n;i ++) { ans = max(ans,dp [i]);//ans的作用是在最底部的元素中找一个最大的dp,输出 } cout << ans << endl; return 0; }
相关文章推荐
- 算法学习 - 01背包问题(动态规划C++)
- 【算法笔记】动态规划,三个例题(解题思路与C++代码)
- Leetcode-64_. Minimum Path Sum(最小路径和)—动态规划解法+记忆化搜索解法-C++解
- C++ & Java——1807——动态规划
- c++使用动态规划dp(自底向上)重构解决钢条切割输出最大收益和切割方案及运行实例结果
- 0/1背包问题 - 动态规划(C++实现)
- 算法学习 - 动态规划(DP问题)装配线问题(C++)
- 0-1背包问题与完全背包问题C++实现 动态规划
- [C++]LeetCode: 96 Maximum Product Subarray(动态规划)
- 【LeetCode】120. Triangle 基于C++和Java的分析及解法,动态规划
- 动态规划--凑硬币 C++实现
- 算法导论-第15章-动态规划:最长公共子序列(空间复杂度改进版)C++实现
- 动态规划C++
- NOI 1808:公共子序列(C++) 动态规划
- c++使用动态规划dp(自底向上)重构解决钢条切割输出最大收益和切割方案及运行实例结果
- 动态规划(1) 编程题#2: 滑雪(C++ STL中Map的按Key排序和按Value排序,memset函数直接将数组中的元素全部置成某个数,常函数)
- C++ 动态规划
- [动态规划]飞机炸弹游戏 C++实现
- 【LeetCode】132. Palindrome Partitioning II 基于动态规划DP、C++、Java的分析及解法
- C++动态规划