忆一道百度面试题
来源:互联网 发布:php技术文档怎么写 编辑:程序博客网 时间:2024/04/28 04:55
博主参加了百度2015届校招,最后跪了,其中过程不说,感觉自己确实还是太菜。Anyway,从当下做起,继续学习。
题意:题目大概的意思是有一个N x N的矩阵方格,在这个矩阵中有M个硬币,每个硬币的位置事先知道,且一个格子最多只能放一个硬币,现有一个机器人从(0,0)的位置开始走,每次只能向下或者向右走一格,最终到达(N,N),设计程序计算机器人能拿到的最大的硬笔数。
看到这个题目一看就是一个动态规划的问题。既然是动态规划问题,就需要找到状态和状态转换方程。
先做一些设置:
1、coins[N][N]用来表示整个矩阵,用0,1初始化矩阵,若coins[i][j] == 1,表示当前格子有硬币,0则表示没有硬币;
2、设S[i][j]表示机器人走到第(i, j)这个位置的时候最多能收集的硬币数;
所以很容易想到到达(i, j)位置能收集的最大硬币数等于到达上一个位置所收集的最大的硬币数加上当前位置的硬币数:
S[i][j] = max(S[i - 1][j] ,S[i][j - 1] ) + coins[i][j];
下面直接上代码:
#include<iostream>#include<stdlib.h>using namespace std;#define N 4int MaxCoins(int(*a)[N]){int S[N][N] = {0};for(int i = 0; i < N; i++){for(int j = 0; j < N; j++){int preMaxCoins = 0;int currentCoin = a[i][j];//上一个位置有可能是当前位置的正上方的位置int preUp = 0;//上一个位置有可能是当前位置的正左方的位置int preLeft = 0;if(i > 0)preUp = S[i - 1][j];if(j > 0)preLeft = S[i][j - 1];preMaxCoins = (preUp >= preLeft) ? preUp : preLeft;S[i][j] = preMaxCoins + currentCoin;}}return S[N - 1][N -1];}int main(){int a[N][N] = { {0,1,1,0},{1,0,1,1},{0,1,0,1},{1,0,1,0}};int max = MaxCoins(a);cout<<"The max coins is:"<<endl;cout<<max<<endl;system("pause");return 0;}
先到这里(2014.10.26)
0 0
- 忆一道百度面试题
- 百度面试题一道
- 一道百度面试题
- 一道百度面试题
- 一道百度面试题
- 一道百度面试题
- 一道百度面试题
- 一道百度面试题
- 一道百度面试题题解
- 一道解读百度面试题
- 百度一道面试题的PHP解答
- 百度校园招聘的一道面试题
- 百度一道面试题引发的思考
- 一道百度最新面试题的实现
- 百度面试题,一天一道慢慢来
- 百度的一道面试题(关于Cache的)
- 百度面试题一道2(著名的蚂蚁问题)
- 【题目36】百度的一道面试题-找到攻击IP
- poj2528(线段树离散染色)
- ubuntu12.04 禁用访客
- C语言编程:从键盘中输入一个数字,返回值为整数有效位数
- A Tour of Go Named results
- POJ 3304 segments (直线与线段相交)
- 忆一道百度面试题
- struct和typedef struct的区别
- leetcode - Find Minimum in Rotated Sorted Array II
- 第9周项目 2。3 求和
- HDU 1233 还是畅通工程(并查集)
- Clean Coder的发现
- ++i还是i++?
- Codeforces Round #275 (Div. 2) --B Friends and Presents
- 过山车 (二分图,求最大增广路径)