Java 矩阵和自顶向下动态规划 问题
给你一个矩阵。您需要打印矩形中所有数字的总和,该矩形有左上角和右下角 我使用自顶向下的动态规划方法来解决这个问题。查看我的代码Java 矩阵和自顶向下动态规划 问题,java,algorithm,dynamic-programming,Java,Algorithm,Dynamic Programming,给你一个矩阵。您需要打印矩形中所有数字的总和,该矩形有左上角和右下角 我使用自顶向下的动态规划方法来解决这个问题。查看我的代码 import java.util.*; 公共类矩阵 { 静态int dp[][]=new int[4][4];//用于调试最大大小10011001 静态int-findsum(int-arr[],int-i,int-j) { 如果(i在您计算的行中 dp[i][j]=findsum(arr,i-1,j)+findsum(arr,i,j-1)+findsum(arr,i-
import java.util.*;
公共类矩阵
{
静态int dp[][]=new int[4][4];//用于调试最大大小10011001
静态int-findsum(int-arr[],int-i,int-j)
{
如果(i在您计算的行中
dp[i][j]=findsum(arr,i-1,j)+findsum(arr,i,j-1)+findsum(arr,i-1,j-1)+arr[i][j];
你实际上是在数两次许多细胞
你应该这样写(我刚把a+改成-):
dp[i][j]=findsum(arr,i-1,j)+findsum(arr,i,j-1)-findsum(arr,i-1,j-1)+arr[i][j];
试着在一张纸上画出矩阵,并试着写下在计算小i,j样本时,你要为dp[i][j]
的和加上的单元格(你在矩形中计算单元格,从(1,1)开始,以(i-1,j-1)结束三次)
更改后,您可以从第一行开始,从左到右计算每行的DP数组。我真的很困惑。您只需要对所有元素求和。如何将其拆分为递归问题?如果有什么问题,您需要将矩阵拆分为不相交的n
子矩阵。我为每个子矩阵创建了2个矩阵maller mat,但这给了我TLE,所以我不得不使用动态规划。只需迭代该区域中的所有元素并求和。不需要2个矩阵。这太复杂了。问题的约束条件是矩阵的大小非常大,最多可达10^3,查询的数量最多可达10^5,因此,如果我为新查询反复计算,那么它将超过时间限制。我还不清楚你想在这里做什么。在问题中,你说“给你一个矩阵。你需要打印矩形中所有数字的总和,该矩形有左上角和右下角。”老实说,我甚至不知道I
和j
应该是什么。你是想说你想创建一个包含所有可能的查询组合的查找表吗?你没有足够的内存。是的,我也这么想,在查询部分我将它改为findSum(arr,I-1,j-1),它终于起作用了
3 3
1 2 3
4 5 6
7 8 9
2
3 3
2 3
162
60
[[-1, -1, -1, -1], [-1, 5, 11, 11], [-1, 13, 38, 60], [-1, 13, 64, 162]]
45
21