经典算法面试题(三):小猪吃米
来源:互联网 发布:linux挂载光盘 编辑:程序博客网 时间:2024/04/28 19:36
题目:
在国际象棋的棋盘上面有 NxN个格。每个格里面有若干的米粒。一只小猪站在1x1的格里,小猪每次只能向高位的列或行移动。小猪会吃掉所经过的格子里面所有的米粒。请编写程序计算小猪能吃掉的米粒的最大值。
分析:
假设小猪从(0,0)开始到棋盘上任一点(m,n)所能吃到的最多米粒数为f(m,n),则f(m,n)满足下列关系式:
f(m,n)=max{f(m,n-1), f(m-1,n)} + Matrix[m][n];
注意:
f(0,j) = f(0, j-1) + matrix[0][j], 0<=j<=N-1
f(i,0) = f(i-1, 0) + matrix[i][0], 0<=i<=N-1
上面分析的思路实际上是典型的动态规划思路。
源程序:
#include <stdio.h>#define MAX(a, b) ((a > b) ? a : b)#define N 4int matrix[N][N] = {{2,2,3,0}, {0,3,1,1}, {1,2,2,1}, {4,1,2,2}};int count[N][N];// 初始化小猪在第0行或第0列所有位置所能吃到的最大米粒数void initialize(){ count[0][0] = matrix[0][0]; for(int i=1; i < 4; i++) { count[0][i] = count[0][i-1] + matrix[0][i]; count[i][0] = count[i-1][0] + matrix[i][0]; }}// 找出所能吃到的最大的米粒数int find_max (int i, int j){ if(0 == i) { return count[0][j]; } else if(0 == j) { return count[i][0]; } int count1 = find_max (i, j-1); int count2 = find_max (i-1, j); count[i][j] = matrix[i][j] + MAX (count1, count2); return count[i][j];}// 打印出小猪吃米的完整路径void print_path (int i, int j){ if ( i >= 0 && j >= 0 ) { if(count[i][j] == count[i-1][j] + matrix[i][j]) { print_path (i-1, j); } else if(count[i][j] == count[i][j-1] + matrix[i][j]) { print_path (i, j-1); } if(N - 1 == i && N - 1 == j) { printf ("(%d,%d)", i, j); } else { printf ("(%d,%d)->", i, j); } }}// 打印出小猪走到矩阵中任一点所能吃到的最大米粒数void print (void){ for(int i = 0; i < 4; ++i) { for(int j = 0; j < 4; ++j) { printf ("%d\t", count[i][j]); } printf ("\n"); }}int main (void){ initialize (); int max = find_max(3, 3); printf("count = %d\n", max); print(); printf("\nThe path is:\n"); print_path(3, 3); putchar('\n'); return 0;}
运行结果:
count = 152 4 7 7 2 7 8 9 3 9 11 12 7 10 13 15 The path is:(0,0)->(0,1)->(1,1)->(2,1)->(2,2)->(3,2)->(3,3)
阅读全文
0 0
- 经典算法面试题(三):小猪吃米
- 小猪吃米的面试题——解法比较
- 经典面试题(三)
- 算法经典面试题
- 经典算法面试题
- 经典算法面试题(-)
- 经典算法面试题
- 经典的SQL面试题(三)
- 经典C/C++面试题(三)
- 经典C/C++面试题(三)
- 经典前端面试题(三)
- java经典算法面试题(1)
- 经典面试题-- 排序算法(一)
- 算法面试题三
- 轩辕互动Exoweb笔试题(二):小猪吃米
- C++经典面试题(三)
- Sql经典面试题三
- 经典面试题(三)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
- 多线程并发编程
- 修改git使用的远程仓库
- BZOJ 3052: [wc2013]糖果公园
- 世界各国Google网址大全
- python 排列组合
- 经典算法面试题(三):小猪吃米
- MATLAB中dither抖动函数的用法
- 响应式开发之viewport
- 无线路由器cat命令导出flash镜像
- 南京搭建7eleven无人便利店系统
- struts2 基础配置 简单配置
- 死锁小结
- 物联网技术十大核心领域应用及前景
- null 是什么类型的