17 动态规划解礼物的最大价值

问题描述:在一个m*n的棋盘上每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0),你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或向下移动一格,直到到达期盼的右下角,给定一个棋盘极其上面的礼物的价值,请计算你最多拿到多少价值的礼物;递归解法分析:每次都可以往下和往右走,在走到最后那个元素的时候,记录这条路径下的值,并保存在最大堆PriorityQueuemaxheap=new PriorityQueue<>(Collections.reverseOrder);中
 

public int maxValue(int [][]matrix)
{
PriorityQueuemaxHeap=PriorityQueue<>();
MaxValue(matrix,0,0,maxHeap,0);
return maxHeap.peek();

}

private void MaxValue(int[][]matrix,int rowIndex,int columnIndex,PriorityQueue maxHeap,int sum)
{
if(rowIndex>=matrix.length||columnIndex>=matrix[rowIndex].length)
{
maxHeap.add(sum);
return;
}else
{
sum+=matrix[i][j];
}
MaxValue(matrix,rowIndex+1,columnIndex,maxHeap,sum);
MaxValue(matrix,rowIndex,columnIndex+1,maxHeap,sum);

}

动态规划求解:可以定义二维数组dp[i][j]表示以[i][j]为终点的最大礼物dp[i][j]=nums[i][j]+Math.max(dp[i-1][j],dp[i][j-1])

int maxProfit(int [][]matrix)
{
int [][]dp=new int[matrix.length][matrix[0].length];
dp[0][0]=matrix[0][0];
for(int i=1;i {
dp[i][0]=matrix[i][0]+dp[i-1][0];
}
for(int i=1;i {
dp[0][i]=dp[0][i-1]+matrix[0][i];
}
for(int i=1;i {
for(int j=1;j {
dp[i][j]=matrix[i][j]+Math.max(dp[i-1][j],dp[i][j-1]);
}
}
return dp[matrix.length-1][matrix[0].length-1];
}

你可能感兴趣的:(JAVA刷题500道,动态规划,算法,java)