【问题标题】:Maximize The Cut Segments using top down approach?使用自上而下的方法最大化切割段?
【发布时间】:2021-06-10 23:24:17
【问题描述】:

给定一个整数 N 表示线段的长度。您需要以这样一种方式切割线段,即每次切割线段的长度为 x 、 y 或 z 。这里 x、y 和 z 是整数。 执行所有剪切操作后,您的剪切段总数必须达到最大值。
示例 1

Input:
N = 4
x = 2, y = 1, z = 1
Output: 4
Explanation:Total length is 4, and the cut
lengths are 2, 1 and 1.  We can make
maximum 4 segments each of length 1.

示例 2

Input:
N = 5
x = 5, y = 3, z = 2
Output: 2
Explanation: Here total length is 5, and
the cut lengths are 5, 3 and 2. We can
make two segments of lengths 3 and 2.

这是我的解决方案

int max_seg(int M[], int n, int x, int y, int z)
{
    if( (n<=0) && (M[0] != -1) )
        return M[0];
    else if( (n>0) && M[n] != -1)
        return M[n];
        
    int q;
    if(n <= 0)
    {
        q = 0;
        M[0] = q;
        return M[0];   
    }
    else
    {
        q = max({1 + max_seg(M, n-x, x, y, z), 1 + max_seg(M, n-y, x, y, z), 1 + max_seg(M, n-y, x, y, z) });
        M[n] = q;
        return M[n];
    }
}
int maximizeTheCuts(int n, int x, int y, int z)
{
    //Your code here
    int M[n+1] = {0}; // compiler does permit this
    for(int i=0; i<=n; i++)
        M[i] = -1;
    return max_seg(M, n, x, y, z);
}

我的代码有什么问题。任何帮助表示赞赏。
下面的测试用例失败了

N= 4000
x=3 y=4 z=5
returned 1334 instead of 1333

【问题讨论】:

  • 针对特定测试用例,在使用调试器逐行执行代码时,您观察到了什么? Add that information to your question please.
  • max_seg 不会拒绝使n 为负数的解决方案,因此它会找到一个解决方案,该解决方案使 1334 个长度为 3 的剪切;别介意这个解决方案会留下一段长度为 -2 的片段。一般来说,你的程序总是返回ceil(n/min(x, y, z))
  • @IgorTandetnik 我该如何解决这个问题。谢谢
  • 你需要确保 max_seg 永远不会用负数 n 调用,否则,如果用负数 n 调用,它会返回一个不会被采用的值作为最佳解决方案。
  • @IgorTandetnik yessssss 谢谢修复它......你的建议很有帮助。

标签: c++ algorithm dynamic-programming


【解决方案1】:

您需要确保 max_seg 永远不会使用负数 n 调用,否则,如果使用负数 n 调用,它会返回一个不会被视为最佳解决方案的值。 – @IgorTandetnik

修复

int max_seg(int M[], int n, int x, int y, int z)
{
    if( (n<0) )
        return INT_MIN;
    else if( (n>=0) && M[n] != -1)
        return M[n];
        
    int q;
    if(n <= 0)
    {
        q = 0;
        M[0] = q;
        return M[0];   
    }
    else
    {
        q = max({1 + max_seg(M, n-x, x, y, z), 1 + max_seg(M, n-y, x, y, z), 1 + max_seg(M, n-y, x, y, z) });
        M[n] = q;
        return M[n];
    }
}
int maximizeTheCuts(int n, int x, int y, int z)
{
    //Your code here
    int M[n+1] = {0}; // compiler does permit this
    for(int i=0; i<=n; i++)
        M[i] = -1;
    return max_seg(M, n, x, y, z);
}

【讨论】:

  • @IgorTandetnik 非常感谢您的见解
猜你喜欢
  • 2020-12-11
  • 2014-05-20
  • 2020-03-04
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 2011-05-20
  • 2018-06-29
  • 2020-07-03
相关资源
最近更新 更多