【算法】数字三角形问题
2014-08-27 09:33
232 查看
如图所示,所谓数字三角形问题,即根据一棵完全二叉树从其根结点开始寻找一条其到叶子结点的路径,使得路径上所经过的数字之和最小(也有的求最大值)。很多算法题目的原型就是这个问题,比如:http://hihocoder.com/problemset/problem/1037。
1.问题描述
如图所示,所谓数字三角形问题,即根据一棵完全二叉树从其根结点开始寻找一条其到叶子结点的路径,使得路径上所经过的数字之和最小(也有的求最大值)。很多算法题目的原型就是这个问题,比如:http://hihocoder.com/problemset/problem/1037。
2.算法思路
解决这个问题,最经典的还是利用动态规划。3.实现代码
#include<iostream>
using namespace std;
int main(){
int n=0;
cin>>n;
int* x=new int
;
int* best=new int
;
for(int i=0;i<n;++i){
x[i]=0;
best[i]=0;
}
for(int i=0;i<n;++i){
for(int j=0;j<=i;++j){//每次输入一行
cin>>x[j];
}
//这里从右向左(j=i,...,0)计算是为了将空间复杂度减少到O(n),如果从左到右计算的话空间复杂度为 //O(n^2).这个其实在利用动态规划解决问题中减少空间复杂度的一个简单技巧.
for(int j=i;j>=0;--j){
if(0==j){//最左结点
best[j]=best[j]+x[j];
}else if(i==j){//最右结点
best[j]=best[j-1]+x[j];
}else{
best[j]=max(best[j-1],best[j])+x[j];
}
}
}
//从左到右遍历叶子结点,求出最优路径和
int max=0;
for(int i=0;i<n;++i){
if(max<best[i]){
max=best[i];
}
}
cout<<max<<endl;
delete []x;
delete []best;
return 0;
}
相关文章推荐
- 算法 数字三角形问题
- 算法基础之python实现动态规划中数字三角形和最长上升子序列问题
- 数字三角形问题 算法入门经典
- 算法笔记 //14_数字三角形问题
- 算法-------统计数字问题
- 最简单的贪心算法--删除数字问题
- POJ 1163 数字三角形问题(DP)
- 数字三角形问题
- 统计数字问题[算法设计与分析]
- 甲乙两人互猜数字(鬼谷子问题)的逻辑推理与算法建模
- 算法考试填数字问题
- 统计数字问题-算法实现(暴力统计法)
- 阿里巴巴校招算法(黑板50个数字问题)
- sdut.acm 2012级《程序设计基础Ⅱ)》_动态规划 数字三角形问题
- 3-4 数字三角形问题
- 数字三角形问题--动态规划练习(1)
- 实验四 回溯算法和分支限界法 符号三角形问题
- 问题描述如下: 有2.5亿个整数(这2.5亿个整数存储在一个数组里面,至于数组是放在外存还是内存,没有进一步具体说明); 要求找出这2.5亿个数字里面,不重复的数字的个数; 另外,可用的内存限定为600M; 要求算法尽量高效,最优;
- 动态规划 问题之数字三角形(倒序递推)
- 数字三角形问题