Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 矩阵和自顶向下动态规划 问题_Java_Algorithm_Dynamic Programming - Fatal编程技术网

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