小东所在公司要发年终奖,而小东恰好获得了最高福利,他要在公司年会上参与一个抽奖游戏,游戏在一个6*6的棋盘上进行,上面放着36个价值不等的礼物,每个小的棋盘上面放置着一个礼物,他需要从左上角开始游戏,每次只能向下或者向右移动一步,到达右下角停止,一路上的格子里的礼物小东都能拿到,请设计一个算法使小东拿到价值最高的礼物。
给定一个6*6的矩阵board,其中每个元素为对应格子的礼物价值,左上角为[0,0],请返回能获得的最大价值,保证每个礼物价值大于100小于1000。
小东所在公司要发年终奖,而小东恰好获得了最高福利,他要在公司年会上参与一个抽奖游戏,游戏在一个6*6的棋盘上进行,上面放着36个价值不等的礼物,每个小的棋盘上面放置着一个礼物,他需要从左上角开始游戏,每次只能向下或者向右移动一步,到达右下角停止,一路上的格子里的礼物小东都能拿到,请设计一个算法使小东拿到价值最高的礼物。
给定一个6*6的矩阵board,其中每个元素为对应格子的礼物价值,左上角为[0,0],请返回能获得的最大价值,保证每个礼物价值大于100小于1000。
class Bonus {
public:
int getMost(vector<vector<int> > board) {
// write code here
int dp[6][6];
dp[0][0]=board[0][0];
for(int i=0;i<6;i++)
for(int j=0;j<6;j++)
{
if(!j && !i)
continue;
else
dp[i][j] = max((j==0)?0:dp[i][j-1],(i==0)?0:dp[i-1][j])+ board[i][j];
}
return dp[5][5];
}
};
class Bonus {public:int getMost(vector<vector<int> > board) {if(board.empty()) return 0;for(int i = 1; i < 6; ++ i) {board[0][i] += board[0][i - 1];board[i][0] += board[i - 1][0];}for(int i = 1; i < 6; ++ i){for(int j = 1; j < 6; ++ j){board[i][j] += max(board[i - 1][j], board[i][j - 1]);}}return board[5][5];}};
class Bonus {
public:
int getMost(vector<vector<int> > board) {
// write code here
int m = board.size(), n = board[0].size();
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
dp[i][j] =
max(dp[i - 1][j], dp[i][j - 1]) + board[i - 1][j - 1];
}
}
return dp[m][n];
}
};
// 状态转移方程:dp[x][y] = max(dp[x-1][y],dp[x][y-1]) + board[x][y];
import java.util.*;
public class Bonus {
int[][] dp = new int[6][6]; // 存放每个位置最大价值
public int getMost(int[][] board) {
return dp(board, 5, 5);
}
public int dp(int[][] board,int x,int y){
// 如果出界,返回0
if(x<0 || y<0)return 0;
if(dp[x][y]==0){ // 如果之前未保存过当前最大位置的价值,则求之
int p1 = dp(board, x-1, y);// 从左侧过来时的最大值
int p2 = dp(board, x, y-1);// 从上册过来时的最大值
dp[x][y] = (p1>p2?p1:p2)+board[x][y];// 取上、左侧中较大的加上此位置的礼物价值即得当前位置最大礼物价值
}
return dp[x][y]; // 返回当前位置礼物最大值
}
}
import java.util.*;
//这道题用递归更简单写
public class Bonus {
public int getMost(int[][] board) {
// write code here
return getM(board,0,0);
}
public int getM(int[][] board,int a,int b){
if(a==5&&b==5)
return board[5][5];
else if(a==5&&b<5){
return board[5][b]+getM(board,5,b+1);
}
else if(b==5&&a<5)
return board[a][5]+getM(board,a+1,b);
else{
int c=getM(board,a+1,b);
int d=getM(board,a,b+1);
return board[a][b]+(c>=d?c:d);
}
}
}
class Bonus {
public:
int getMost(vector<vector<int> > board) {
// write code here
int row = board.size();
int col = board[0].size();
vector<vector<int>> Dp(row,vector<int>(col,0));
Dp[0][0]=board[0][0];
for(int i=1; i<row; ++i){
Dp[i][0] = Dp[i-1][0] + board[i][0];
}
for(int i=1; i<col; ++i){
Dp[0][i] = Dp[0][i-1] + board[0][i];
}
for(int i=1; i<row; ++i){
for(int j=1; j<col; ++j){
Dp[i][j]=max(Dp[i-1][j],Dp[i][j-1])+board[i][j];
}
}
return Dp[row-1][col-1];
}
};
importjava.util.*;publicclassBonus {publicintgetMost(int[][] board) {// write code hereintresult = 0;result = getMost(board.length-1,board[board.length-1].length-1,board);returnresult;}publicintgetMost(inti,intj,int[][] board){intresult = board[i][j];intleft = 0;inttop = 0;if(i>0){left = getMost(i-1,j,board);}if(j>0){top = getMost(i,j-1,board);}if(left >=top){result = result + left;}else{result = result + top;}returnresult;}}
// 我给一个递归版本的解答。思路就是对于任意点(i,j),
// 它能取到的最大值取决于于(i-1,j)和(i,j-1)中的最大值。
public class Main {
public static void main(String[] args) {
int[][] testCase = new int[6][6];
for(int i = 0; i < 6; i++)
{
for (int j=0; j<6; j++)
{
testCase[i][j] = i + j + 1;
}
}
System.out.println(getMost(testCase));
}
public static int getMost(int[][] board) {
return getMost(board, 5, 5);
}
public static int getMost(int[][] board, int i, int j) {
int max;
if (i > 0 && j > 0)
{
max = board[i][j] + Math.max(getMost(board, i, j-1), getMost(board, i-1, j));
}
else if (i > 0 && j == 0)
{
max = board[i][j] + getMost(board, i-1, j);
}
else if (i == 0 && j > 0)
{
max = board[i][j] + getMost(board, i, j-1);
}
else
{
max = board[i][j];
}
return max;
}
}
class Bonus {
public:
int getMost(vector<vector<int> > board) {
// write code here
int a[6][6];
for(int i=0;i<6;i++){
for(int j=0;j<6;j++){
a[i][j]=0;
}
}
for(int i=0;i<6;i++){
for(int j=0;j<6;j++){
if(i==0 && j==0){a[i][j]=board[0][0];}
else if(i==0){a[i][j]=board[i][j]+a[i][j-1];}
else if(j==0){a[i][j]=board[i][j]+a[i-1][j];}
else
a[i][j]=board[i][j]+((a[i-1][j])>a[i][j-1]?a[i-1][j]:a[i][j-1]);
}
}
return a[5][5];
}
}
; static int getMost(int[][] values){
if (values == null || values.length == 0 || values[0].length == 0){
return 0;
}
// 创建一个dp备忘录
int m = values.length;
int n = values[0].length;
int[][] dp = new int[m][n];
//初始化备忘录
dp[0][0] = values[0][0];
for (int i = 1; i < m; i++) dp[0][i] = values[0][i] + dp[0][i - 1];
for (int i = 1; i < n; i++) dp[i][0] = values[i][0] + dp[i - 1][0];
for (int i = 1; i < m; i++){
for (int j = 1; j < n; j++){
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + values[i][j];
}
}
return dp[m - 1][n - 1];
} mport java.util.*;
public class Bonus {
public int getMost(int[][] board) {
// write code here
if(board == null || board.length == 0 || board[0].length == 0)
return 0;
else{
int n = board[0].length;
int dp[] = new int[n];
for(int[] values: board){
dp[0] += values[0];
for(int i=1;i<n;i++){
dp[i] = Math.max(dp[i-1],dp[i]) + values[i];
}
}
return dp[n-1];
}
}
}
class Bonus {
public:
int getMost(vector<vector<int> > board) {
int m = board.size();
int n = board[0].size();
vector<vector<int>> vv(m, vector<int>(n, 0));
vv[0][0] = board[0][0];
for(int i = 0; i < m; ++i){
for(int j = 0; j < n; ++j){
//如果是起点坐标,不做任何处理。
if(i == 0 && j == 0){
continue;
}
//如果走在行的临界边,也就是第一行,那么他只能向右走
//向右走的时候该点就要将后面的值加起来。
else if(i == 0){
vv[i][j] = vv[i][j - 1] + board[i][j];
}
//如果走在列的临界边,也就是第一列,那么他只能向下走
//向下走的时候该点就要将上面的值加起来。
else if(j == 0){
vv[i][j] = vv[i - 1][j] + board[i][j];
}
//除去两个临界边,剩下的就是既能向右走,也能向下走,
//这时候就要考虑走到当前点的所有可能得情况,也就是走到当前点
//各自路径的和是不是这些所有到达该点路径当中最大的了。
else{
vv[i][j] = max(vv[i - 1][j], vv[i][j - 1]) + board[i][j];
}
}
}
return vv[m - 1][n - 1];
}
}; import java.util.*;
public class Bonus {
public int getMost(int[][] board) {
int n=board.length; // 行数
int m=board[0].length; // 列数
int[] dp=new int[m+1]; //加一列虚拟列
for (int i=0;i<n;i++){
for (int j=1;j<m+1;j++){ // 列从第二列开始
if(board[i][j-1]>100&&board[i][j-1]<1000){
dp[j]=Math.max(dp[j],dp[j-1])+board[i][j-1];
}
else{
dp[j]=0;
}
}
}
return dp[m];
}
} # -*- coding:utf-8 -*- class Bonus: def getMost(self, board): # write code here dp = [[0 for j in range(6)] for i in range(6)]#初始化dp矩阵 dp[0][0] = board[0][0] for i in range(5): dp[0][i+1] = dp[0][i]+board[0][i+1]#第一行的最大值,只能是从dp[0][0]一直向右走 dp[i+1][0] = dp[i][0]+board[i+1][0]#第一列的最大值,只能是从dp[0][0]一直向下走 for j in range(1,6): for k in range(1,6): #当前位置的最大值,只能由上一次位置向下或向右所得 #故当前位置最大值等于max(上面, 左边)+当前位置的礼物值 dp[j][k] = max(dp[j-1][k], dp[j][k-1])+board[j][k] return dp[5][5]
一维dp,参考矩阵中的最大路径和(C++)
class Bonus {
public:
int getMost(vector<vector<int> > board) {
// write code here
int m = board.size();
int n = board[0].size();
vector<int > dp(n, 0);
for(int i = 0; i < m; ++i){
for(int j = 0; j < n; ++j){
if(i == 0 && j == 0){
dp[j] = board[0][0];
}if(i == 0){
dp[j] = dp[j-1] + board[0][j];
}else if(j == 0){
dp[j] += board[i][0];
}else{
dp[j] = max(dp[j], dp[j-1]) + board[i][j];
}
}
}
return dp[n-1];
}
};
class Bonus:
def getMost(self, board): #递归实现
maxValue = [0] #python2没有nonlocal关键词,就使用可变的对象list
def pathCross(nowValue,i,j):
if i == j == 5:
maxValue[0] = max(nowValue+board[i][j],maxValue[0])
else:
if i+1 < 6:
pathCross(nowValue+board[i][j],i+1,j)
if j+1 < 6:
pathCross(nowValue+board[i][j],i,j+1)
pathCross(0,0,0)
return maxValue[0]
import java.util.*;
public class Bonus {
public int getMost(int[][] board) {
int n=board.length;
int m=board[0].length;
int[][] dp=new int[board.length][board[0].length];
dp[0][0]=board[0][0];
for(int i=1;i<n;i++){
dp[i][0]=dp[i-1][0]+board[i][0];
}
for(int i=1;i<m;i++){
dp[0][i]=dp[0][i-1]+board[0][i];
}
for(int i=1;i<n;i++){
for(int j=1;j<m;j++){
dp[i][j]=dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1];
dp[i][j]+=board[i][j];
}
}
return dp[n-1][m-1];
}
}
class Bonus {
public:
int getMost(vector<vector<int> > board) {
// write code here
//动态规划
vector<vector<int>> dp(6, vector<int>(6));
dp[0][0] = board[0][0];
for(int i = 1; i < 6; i++)
{
dp[0][i] = board[0][i] + dp[0][i-1];
dp[i][0] = board[i][0] + dp[i-1][0];
}
for(int i = 1; i < 6; i++)
{
for(int j = 1; j < 6; j++)
{
dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + board[i][j];
}
}
return dp[5][5];
}
};