在一个m x n的棋盘的每一个字都放有一个礼物,每个礼物都有一定的价值(价值大于0)。可以从棋盘的左上角开始拿格子里的礼物,并每次向左或向下移动一格,直到到达棋盘的右下角。给定一个棋盘及棋盘上面的礼物,计算出最多能拿到多少价值的礼物。
首先定义一个函数f(i,j)表示到达坐标为(i,j)时能拿到礼物的总和的最大值。要想到达坐标为的格子有两条路径:通过格子(i-1,j)或者(i,j-1)。所以f(i,j)=max(f(i-1,j),f(i,j-1))+gift[i,j]。gift[i,j]表示坐标为[i,j]的格子里礼物的价值。建立一个辅助二维数组maxValue,数组中坐标为[i,j]的元素表示到达作为为[i,j]的格子时能拿到礼物价值总和的最大值,最终返回最后一个格子的大小即可。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
int getMaxValue(int *values, int rows, int cols)
{
if (values == NULL || rows <= 0 || cols <= 0)
{
return 0;
}
int **maxValue = (int **)malloc(rows*sizeof(int*));
for (int i = 0; i < cols; i++)
{
maxValue[i]= (int *)malloc(cols*sizeof(int));
}
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
int left = 0;
int up = 0;
if (i>0)
up = maxValue[i-1][j];
if (j>0)
left = maxValue[i][j-1];
if (up > left)
{
maxValue[i][j]= up + values[i*cols + j];
}
else
{
maxValue[i][j] = left + values[i*cols + j];
}
}
}
int maxValue1 = maxValue[rows -1][cols-1];
for (int i = 0; i < cols; i++)
{
free(maxValue[i]);
}
free(maxValue);
return maxValue1;
}