C++动态规划算法之数字三角形系列问题:数塔及其变种
2017-09-07 13:23
465 查看
数字三角形系列问题
在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30
接下来共R行,第i行有i个整数。所有的数均非负的且不大于100。
30
23 21
20 13 10
7 12 10 10
4 5 2 6 5
数学三角形II
接下来N行,第i行有i个整数,表示数字三角形
30
26 29
23 23 15
14 14 11 12
数字三角形III
接下来N行,第i行有i个整数,表示数字三角形
3
2 3
1 2 1
1 0 1 1
0 0 0 1 0
数字三角形I
题目描述
考虑在下面被显示的数字金字塔。 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。每一步可以走到左下方的点也可以到达右下方的点。在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30
输入
第1行:1个整数R(1<= R<=1000),表示行的数目。接下来共R行,第i行有i个整数。所有的数均非负的且不大于100。
输出
第1行:可以得到的最大的和。样例输入
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
样例输出
30
思路解析
下面是每个点到底层可以得到的最大数值:30
23 21
20 13 10
7 12 10 10
4 5 2 6 5
代码实现
#include<cstdio> #include<algorithm> using namespace std; int r,a[1002][1002],F[1002][1002]; main() { scanf("%d",&r); for(int i=1;i<=r;i++) for(int j=1;j<=i;j++) { scanf("%d",&a[i][j]); F[i][j]=a[i][j]; } for(int i=r-1;i>0;i--) for(int j=1;j<=i;j++) F[i][j]+=max(F[i+1][j],F[i+1][j+1]); printf("%d",F[1][1]); }
数学三角形II
题目描述
输入
第1行:1个整数N,表示数字三角形的行数和列数(1 <= N <= 1000)接下来N行,第i行有i个整数,表示数字三角形
输出
第1行:1个整数,表示问题的最优解样例输入
5 1 3 6 9 9 1 5 5 2 3 2 9 7 6 1
样例输出
30
思路解析
下面是每个点到底层可以得到的最大数值:30
26 29
23 23 15
14 14 11 12
代码实现
#include<bits/stdc++.h> using namespace std; int n,a[1002][1002],F[1002][1002],G[1002][1002]; main() { scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) { scanf("%d",&a[i][j]); F[i][j]=a[i][j]; } for(int i=n-1;i>0;i--) for(int j=1;j<=i;j++) { F[i][j]+=max(F[i+1][j],F[i+1][j+1]); G[i][j]=max(*max_element(F[i+1]+1,F[i+1]+i+2),max(G[i+1][j],G[i+1][j+1]))+a[i][j]; } printf("%d",max(F[1][1],G[1][1])); }
数字三角形III
题目描述
输入
第1行:1个整数N,表示数字三角形的行数和列数(1 <= N <= 1000)接下来N行,第i行有i个整数,表示数字三角形
输出
第1行:1个整数,表示问题的最优解 第1行:1个整数,表示问题的最优解样例输入
5 0 0 1 0 1 0 1 0 0 0 0 0 0 1 0
样例输出
3
思路解析
下面是每个点到底层可以得到的最大数值:3
2 3
1 2 1
1 0 1 1
0 0 0 1 0
代码实现
#include<cstdio> #include<algorithm> using namespace std; int n,a[1002][1002]; bool F[1002][1002][11]; main() { scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) scanf("%d",&a[i][j]); for(int j=1;j<=n;j++) F [j][a [j]%10]=1; for(int i=n-1;i>0;i--) for(int j=1;j<=i;j++) for(int k=0;k<10;k++) if(F[i+1][j][k]||F[i+1][j+1][k]) F[i][j][(k+a[i][j])%10]=1; for(int i=9;i>=0;i--) if(F[1][1][i]) { printf("%d\n",i); break; } }
相关文章推荐
- C++动态规划算法之数字金字塔【USACO TRAINING】:一道经典的数塔问题
- 动态规划算法:数字三角形问题
- C++ : 指针及其有关的问题
- 数字三角形问题,记忆化搜索
- poj 1163 The Triangle 数字三角形问题
- [LeetCode] “全排列”问题系列(一) - 用交换元素法生成全排列及其应用,例题: Permutations I 和 II, N-Queens I 和 II,数独问题
- 【hdu】4521 小明系列问题——小明序列【LIS变种】
- SDUT 1730 数字三角形问题
- C/C++字符串,字符数组,字符指针及其相互静态拷贝与追加的安全问题解决方案(1)
- C/C++面试之算法系列--如何利用数学思想解1/2/5组合问题
- 代码练习系列:问题 G 数字分类 (20)
- C/C++面试题系列之3:输出1-N个数字
- 数字三角形问题
- poj 1163数字三角形问题--动态规划
- 算法基础之python实现动态规划中数字三角形和最长上升子序列问题
- 《Visual C++ 2010入门教程》系列三:关于C++的一些问题
- 数字三角形问题
- 实战c++中的string系列--指定浮点数有效数字并转为string
- 〖編程·C++〗回溯算法:子集树 - 符号三角形问题