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