当前位置: 首页 > 知识库问答 >
问题:

矩阵和自顶向下动态规划

郎刚捷
2023-03-14

给定一个矩阵。您需要打印矩形中左上角和右下角的所有数字的总和。

我使用自顶向下的动态规划方法来解决这个问题。查看我的代码。

import java.util.*;
public class Matrixsum
{

    static int dp[][] = new int[4][4]; // for debugging max size 1001,1001

    static int findsum(int arr[][] , int i, int j)
    {
        if(i<1 || j < 1) return 0;
        if(dp[i][j] != -1)
            return dp[i][j];
        else
dp[i][j] = findsum(arr,i-1,j)+findsum(arr,i,j-1)+findsum(arr,i-1,j-1)+arr[i][j];
        return dp[i][j];
    }

    public static void main(String[] args)
    {
            for(int[] d:dp) Arrays.fill(d,-1);
            Scanner sc = new Scanner(System.in);
            int a = sc.nextInt();
            int b = sc.nextInt();
            int arr[][] = new int[1001][1001];
            for(int i=0;i<a;i++)
            {
                for (int j = 0; j < b; j++) {
                    arr[i][j] = sc.nextInt();
                }
            }

            int q = sc.nextInt();
            while(q-- > 0)
            {
                int i = sc.nextInt();
                int j = sc.nextInt();
                System.out.println(findsum(arr,i,j));
            }
            System.out.println(Arrays.deepToString(dp));
         //   dp = new int[1001][1001];
        }
}

输入

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

但当输入查询时,这会抛出非常随机的数字。我没有得到我在这里缺少的东西。有人能帮忙吗?

谢谢✌️

共有1个答案

於永寿
2023-03-14

在你计算的那条线上

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数组。

 类似资料:
  • 请,我想找到每行只有一个值的最大和。我已经用暴力做出了决议,它是O(N^5)。现在我想找到一种使用动态规划的方法或另一种降低复杂性的方法。 例如: 矩阵: 5套解决方案: > 100 90 70 60 50 = 370 100 90 69 60 50 = 369 100 90 70 60 45 = 365 100 90 65 60 50 = 365 100 90 69 60 45 = 364 总数

  • 我目前正在研究leetcode上的硬币兑换动态规划问题--https://leetcode.com/problems/coin-change/. 下面是问题陈述: 我试图实现一种自上而下的记忆方法,在这种方法中,我保留了一个长度数量的数组,其中每个索引表示我可以用来生成该数量的最小硬币数量。 以下是我的Java代码: 我认为这是解决这个问题的正确的动态编程方法,但是我在leetcode上超过了时间

  • 我正在学习C。我有一个程序,可以动态创建和填充两个矩阵X和Y,使用随机数使用rand(),如下所示 当我运行这个程序并给出2作为我的矩阵的大小时,我看到“分离故障”是错误。请注意,我们的想法是用双精度类型的随机元素填充两个矩阵。如果上面的代码是正确的,请告诉我。 更正:编辑1 以上功能现在正常工作。需要解释x=(double**)malloc(m*sizeof(double*));并且x[i]=(

  • 本文向大家介绍动态规划之矩阵连乘问题Python实现方法,包括了动态规划之矩阵连乘问题Python实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了动态规划之矩阵连乘问题Python实现方法。分享给大家供大家参考,具体如下: 给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数

  • 4.3 自顶向下设计 采用传统过程式语言进行模块化编程时,主要通过自顶向下方法来进行系统设计。 自顶向下设计也称为逐步求精(stepwise refinement),是将一个系统逐层分解为子系统的设计过程。首先,对整个系统进行概要设计,指明构成系统的顶层子系统有哪些,注意在 此并不给出各个子系统的细节。其次,对每个子系统重复这个设计过程,即再将每个子系统 分解为下一层的子系统。就这样不断细化每个子

  • 本文向大家介绍Java矩阵连乘问题(动态规划)算法实例分析,包括了Java矩阵连乘问题(动态规划)算法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java矩阵连乘问题(动态规划)算法。分享给大家供大家参考,具体如下: 问题描述:给定n个矩阵:A1,A2,...,An,其中Ai与Ai+1是可乘的,i=1,2...,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需