忆一道百度面试题

博主参加了百度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 4

int 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值