数字三角形问题 算法入门经典
2014-04-11 17:58
615 查看
递归方法:
递推方法:
#include <stdio.h> #define maxn 100 int buf[maxn][maxn]; int n; int d(int i, int j){ int t1, t2; return i == n ? buf[i][j] : buf[i][j] + (((t1 = d(i+1, j)) > (t2 = d(i+1, j+1))) ? t1 : t2); } int main(){ /*5 9 12 15 10 6 8 2 18 9 5 19 7 10 4 16 结果 59*/ int i, j; scanf("%d", &n); for(i = 1; i <=n; ++i) for(j = 1; j <= i; ++j) scanf("%d", &buf[i][j]); printf("%d\n", d(1, 1)); return 0; }记忆搜索(递归):
#include <stdio.h> #include <string.h> #define maxn 100 int buf[maxn][maxn]; int d[maxn][maxn]; int n; int dfunc(int i, int j){ if(d[i][j] >= 0) return d[i][j]; return d[i][j] = buf[i][j] + (i == n ? 0 : dfunc(i+1, j) > dfunc(i+1, j+1) ? dfunc(i+1, j) : dfunc(i+1, j+1)); } int main(){ int i, j; scanf("%d", &n); for(i = 1; i <= n; ++i) for(j = 1; j <= i; ++j) scanf("%d", &buf[i][j]); memset(d, -1, sizeof(d)); printf("%d\n", dfunc(1, 1)); return 0; }
递推方法:
#include <stdio.h> #define maxn 200 int d[maxn][maxn]; int n; void dfunc(){ int i, j; for(i = n - 1; i >= 1; --i) for(j = 1; j <= i; ++j) d[i][j] += d[i+1][j] > d[i+1][j+1] ? d[i+1][j]:d[i+1][j+1]; } int main(){ int i, j; scanf("%d", &n); for(i = 1; i <= n; ++i) for(j = 1; j <= i; ++j) scanf("%d", &d[i][j]); dfunc(); printf("%d\n", d[1][1]); return 0; }
相关文章推荐
- 经典动态规划问题--数字三角形 POJ--1163
- 算法之路二:刘汝佳算法竞赛入门经典 3.2开灯问题
- 算法 数字三角形问题
- 算法竞赛入门经典 7.5.3 八数码问题
- DAG上的动态规划 - 算法竞赛入门经典 - 嵌套矩形问题
- 算法竞赛入门经典训练指南-P4例题3 分金币问题总结
- 0-1背包 (算法竞赛入门经典0-1背包问题)
- 算法入门经典 7.4.4 带宽问题 回溯 剪枝
- 算法竞赛入门经典ch3_ex4竖式问题
- 走迷宫问题 算法竞赛入门经典
- 刘汝佳算法竞赛入门经典中的运算符>?问题
- 经典算法题:数字三角形寻找最大路径——动态规划和递归调用两种解法
- 算法竞赛入门经典: 第三章 数组和字符串 3.2开灯问题
- 算法竞赛入门经典 8.3.1 棋盘覆盖问题
- 算法竞赛入门经典-第五章6174问题
- 约瑟夫环问题(根据算法竞赛入门经典一题改编)
- 【算法入门经典】7.4回溯法【八皇后问题】
- 算法竞赛入门经典 例题7-3 倒水问题
- 算法竞赛入门经典 例3-1开灯问题
- 算法竞赛入门经典 油田---经典的联通快问题