数塔问题

csdn_yzm 2016-01-11 03:25:51
如图所示的数字三角形,从顶部出发,在每一结点可以选择向左走或向右走,一直走到底层。试设计一个算法,计算出从三角形的顶至底的一条路径,使该 路径经过的数字总和最大。

要用图形界面,根据输入数塔的高度自动生成数塔吊,并给出数塔从顶部到低部的路径。
...全文
547 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
心随自在飞 2016-01-11
  • 打赏
  • 举报
回复
借鉴: 设有一个三角形的数塔,顶点为根结点,每个结点有一个整数值。从顶点出发,可以向左走或向右走,如图所示: 动态规划经典问题 要求从根结点开始,请找出一条路径,使路径之和最大,只要输出路径的和。 【代码】 // // 例题1 三角数字塔问题 // // #include <stdio.h> #include <stdlib.h> #define MAXN 101 int n,d[MAXN][MAXN]; int a[MAXN][MAXN]; void fnRecursive(int,int); //递推方法函数声明 int fnMemorySearch(int,int); //记忆化搜索函数声明 int main() { int i,j; printf("输入三角形的行数n(n=1-100):\n"); scanf("%d",&n); printf("按行输入数字三角形上的数(1-100):\n"); for(i=1; i<=n; i++) for(j=1; j<=i; j++) scanf("%d",&a[i][j]); for(i=1; i<=n; i++) for(j=1; j<=i; j++) d[i][j]=-1;//初始化指标数组 printf("递推方法:1\n记忆化搜索方法:2\n"); int select; scanf("%d",&select); if(select==1) { fnRecursive(i,j);//调用递推方法 printf("\n%d\n",d[1][1]); } if(select==2) { printf("\n%d\n",fnMemorySearch(1,1));//调用记忆化搜索方法 } else printf("输入错误!"); return 0; } void fnRecursive(int i,int 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]+(d[i+1][j]>d[i+1][j+1]?d[i+1][j]:d[i+1][j+1]); } int fnMemorySearch(int i,int j) //记忆化搜索实现过程 { if(d[i][j]>=0) return d[i][j]; if(i==n) return(d[i][j]=a[i][j]); if(fnMemorySearch(i+1,j)>fnMemorySearch(i+1,j+1)) return(d[i][j]=(a[i][j]+fnMemorySearch(i+1,j))); else return(d[i][j]=(a[i][j]+fnMemorySearch(i+1,j+1))); } 希望能帮助到你!

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧