《剑指offer—面试题47:礼物的最大值》
注明:仅个人学习笔记
详细分析见书上笔记
public int getMaxValue_solution(int[] values, int rows, int cols)
{
if (values == null || rows <= 0 || cols <= 0)
{
return 0;
}
int[][] maxValues = new int[rows][];//数组中坐标为(i,j)的元素,表示到达坐标为(i,j)的格子时,能拿到的礼物价值总和的最大值,保存了到达每行每列的每个点的值信息
// int a = maxValues.length;
// int b = maxValues[0].length;
for (int i = 0; i < rows; i++)
{
maxValues[i] = new int[cols];
}
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
int left = 0;
int up = 0;
if (i > 0)
up = maxValues[i - 1][j];
if (j > 0)
left = maxValues[i][j - 1];
maxValues[i][j] = max(left, up) + values[i * cols + j];
}
}
int maxValue = maxValues[rows - 1][cols - 1];
return maxValue;
}
private int max(int left, int up)
{
if (left > up)
return left;
return up;
}
public static void main(String[] args)
{
GetMaxValue47 g = new GetMaxValue47();
int[] values = { 1, 10, 3, 8, 12, 2, 9, 6, 5, 7, 4, 11, 3, 7, 16, 5 };
int maxValue = g.getMaxValue_solution(values, 4, 4);
System.out.println(maxValue);//53
}
————————————————分割线—————————————————
在优化后,maxValues为cols长度的一维数组,每行遍历时,只保存到达当前行的某个点的最大值
public int getMaxValue_solution(int[] values, int rows, int cols)
{
if (values == null || rows <= 0 || cols <= 0)
{
return 0;
}
int[] maxValues = new int[cols];//长度为cols的一维数组
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
int left = 0;
int up = 0;
if (i > 0)
up = maxValues[j];
if (j > 0)
left = maxValues[j - 1];
maxValues[i][j] = max(left, up) + values[i * cols + j];
}
}
int maxValue = maxValues[cols - 1];//直到,到最后一行的最后一个点即求的最大值
return maxValue;
}
private int max(int left, int up)
{
if (left > up)
return left;
return up;
}
public static void main(String[] args)
{
GetMaxValue47 g = new GetMaxValue47();
int[] values = { 1, 10, 3, 8, 12, 2, 9, 6, 5, 7, 4, 11, 3, 7, 16, 5 };
int maxValue = g.getMaxValue_solution(values, 4, 4);
System.out.println(maxValue);//53
}