数字三角形问题
来源:互联网 发布:淘宝上国棉一厂怎么样 编辑:程序博客网 时间:2024/05/29 08:48
问题描述
状态转移方程
代码实现
- 方法1:效率低下
#include<iostream> #include<string.h>#define maxn 1000 + 5using namespace std;int a[maxn][maxn];int d[maxn][maxn];int n;int D (int i, int j) { return a[i][j] + (i == n ? 0 : max(D(i+1, j), D(i+1, j+1)));} int main() { int i, j; for (; cin >> n && n;) { memset(d, 0, sizeof(d)); for (i = 1; i <= n; i++) { //控制有多少层 for (j = 1; j <= i; j++) { cin >> a[i][j]; } } for (i = 1; i <= n; i++) { for (j = 1; j <= i; j++) { d[i][j] = D(i, j); } } cout << d[1][1]; //注意最终结果的存储位置 } }
原因:
方法2: 倒过来,从树的底层开始思考:
- 方法3: 对于 方法1 进行改进,将已经计算过的 d[i][j] 进行保存:
#include<iostream> #include<string.h>#define maxn 1000 + 5using namespace std;int a[maxn][maxn];int d[maxn][maxn];int n;int D (int i, int j) { if (d[i][j] > 0) return d[i][j] ; //在这里做了优化 return d[i][j] = a[i][j] + (i == n ? 0 : max(D(i+1, j), D(i+1, j+1))); //在这里对计算过的分支进行保存} int main() { int i, j; for (; cin >> n && n;) { memset(d, -1, sizeof(d)); //注意这里初始化为-1,很关键 for (i = 1; i <= n; i++) { //控制有多少层 for (j = 1; j <= i; j++) { cin >> a[i][j]; } } for (j = 1; j <= n; j++) { d[n][j] = a[n][j]; } for(i = n-1; i >= 1; i--) { for (j = 1; j <= i; j++) { d[i][j] = a[i][j] + max(d[i+1][j], d[i+1][j+1]); } } cout << d[1][1]; } }
参考:
- http://www.cnblogs.com/zjutlitao/p/3219015.html
阅读全文
0 0
- 数字三角形问题
- 【dp】数字三角形问题
- 数字三角形问题求解
- 数字三角形问题
- 数字三角形问题
- 数字三角形问题
- 数字三角形问题
- 数字三角形问题
- 数字三角形问题
- DP_数字三角形问题
- 【算法】数字三角形问题
- 数字三角形问题
- 数字三角形问题
- 数字三角形问题
- 数字三角形问题
- 数字三角形问题
- 数字三角形问题
- SDUToj1730数字三角形问题
- Vlan ACL in 和 out 区别
- was 9080端口修改为80端口的两种方式
- 如何判断数据类型
- Ionic2中嵌入图片,音频url地址,出现“WARNING: sanitizing unsafe URL value”错误的解决方法
- 呵呵!手把手带你在 IIS 上运行 Python
- 数字三角形问题
- linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结
- iOS NSSearchPathForDirectoriesInDomains 回顾
- 第十五周项目1-验证算法-归并排序
- 第十三周项目1(1)
- CSS3
- 浅谈Power"s"家族史--Power Povit vs. Power Query vs. Power View vs. Power BI
- Linux进程间通信2
- wechar API地址