【问题标题】:least sum of vertical line in 2d array二维数组中垂直线的最小总和
【发布时间】:2020-12-30 10:23:50
【问题描述】:

我有一个二维数组

行数 = H
列数 = W
二维数组本身 = arr
都是整数

我的任务是返回从第一行的每个点开始的垂直线的最低总和

输入

1 2 3
4 5 6
7 8 9

输出 12

我想了一种通过使用递归来解决这个问题的方法,但我没有得到正确的结果。

该函数采用数组,我想计算最小总和的位置(应该在第一行,因为它是一行)列数和行数,res 是返回总和 res 在主函数中初始化通过 arr 在第 x 行和第 y 列

我确信这个想法,但我总结的方式可能是错误的

static int Summ(int [,]arr,int x,int y,int W,int H,int res)
    {
        if (x == H - 1)
            res += arr[x, y];
        else
            if (y == 0)
                res += Math.Min(Summ(arr, x + 1, y, W, H, res), Summ(arr, x + 1, y + 1, W, H, res));
            else if (y== W-1)
                res += Math.Min(Summ(arr, x + 1, y, W, H, res), Summ(arr, x + 1, y - 1, W, H, res));
            else 
                res+= res += Math.Min(Math.Min(Summ(arr, x + 1, y, W, H, res), Summ(arr, x + 1, y + 1, W, H, res)),Summ(arr,x+1,y-1,W,H,res));
        return res;
    }

【问题讨论】:

  • "垂直线的最低总和从第一行的每个点开始",这没有任何意义。介意创建一个小网格并用颜色绘制那些线吗?或者将这些线的每个点的索引设置为一个简单的网格。
  • 如果我理解正确您的问题:您想从 {0,0} 开始构建一棵树。其中节点 {x,y} 的所有子节点都是 {{x+1, y-1},{x+1,y},{x+1,y+1}}。对于 3x3,最终的树将如下所示:i.stack.imgur.com/lVlw9.png
  • 首先尝试实现这条路径,然后做 sum ,并且只对树末尾的结果 sum 做 mni。之前的任何最低限度都可能导致您走错路。
  • 我无法通过堆栈溢出发布此问题 放置代码时总是出错,尽管堆栈交换在放置代码时具有相同的约束,但我能够通过无法编辑的方式发布我的问题但是如果在这里选择编辑它不会让我保存更改即使我没有真正改变任何东西所以很抱歉因为你的问题我使用递归解决了它做了树和分析并将它发送给 TA 现在我需要将其转换为动态的可能是自下而上的
  • 对不起,因为问题不清楚,但由于病毒,我无法上大学获得支持,而且很难写出我对 sol 的看法。

标签: c# recursion


【解决方案1】:

迭代解决方案可能更简单:

static int MinSum(int [,]arr)
{
    int min = Int32.MaxValue;

    for (int j = 0; j < arr.GetLength(1); ++j) 
    {
        int sum = 0;
        for (int i = 0; i < arr.GetLength(0); ++i)
        {
            sum += arr[i, j];
        }
        min = Math.min(min, sum);
    }

    return min;
}

编辑:
鉴于the comment below 中的说明,此解决方案不正确。
相反,您可以遍历行并对每行中的最小值求和:

static int MinSum(int [,]arr)
{
    int sum = 0;

    for (int i = 0; j < arr.GetLength(0); ++i) 
    {
        int minCol = arr[i, 0];
        for (int j = 1; j < arr.GetLength(1); +_j)
        {
            minCoal = Math.min(minCol, arr[i, j]);
        }
        min += minCol;
    }

    return sum;
}

【讨论】:

  • 这将计算每列的总和,但我没有这样做 4 9 5 6 2 3 7 1 8 每个点的输出应该是 4+2+1,我可以向下或向下- 如果可用,则左或如果可用,则彻底尝试所有可能的解决方案
  • @user13674310,通过edit 按钮澄清问题。必须避免澄清使答案无效。这就是为什么用How to Askminimal reproducible example 写一个问题你得到提示3 次
  • @user13674310 我当时误解了这个问题。请参阅我编辑的答案。
  • i.stack.imgur.com/lVlw9.png 感谢拖放这澄清了我的问题,我在 arr[0,0] 的这张照片中做了什么我在 arr[0,1] 做直到 arr[0,Width -1)所以我在第一行有每个节点的最小总和,它是这棵树中的子节点,你可以清楚地看到重叠,所以我需要将其转换为动态编程编辑的代码在每行中得到最小值并将它们相加
  • 我研究了一下,发现这被称为使用最小接缝雕刻的内容感知图像大小调整,它与我尝试做的一样,但水平和垂直
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多