【问题标题】:memoization in C++C++中的记忆
【发布时间】:2014-11-22 08:53:58
【问题描述】:

根据板球球队的得分,查找/打印所有配置/方法来获得得分。 2、3、7分有3种方式

示例: 得分:10

输出: (0,1,1) (0,2,2) (0,0,5)

void out(int score, int two, int three, int seven)
{
    if(score == 0)
    {
        cout << "(" << two << ", " << three << ", " << seven <<  ")" << endl;
    }
    else if (score < 0)
    {
        return;
    }
    else
    {
        outputs(score - 7, two, three, seven + 1);
        outputs(score - 3, two, three + 1, seven);
        outputs(score - 2, two + 1, three, seven);        
    }
    return;
}

我确实得到了正确的答案,但是重复并且还想使用记忆,我真的很困惑如何实现 (0, 1, 1) (0, 1, 1) (2, 2, 0) (2, 2, 0) (2, 2, 0) (2, 2, 0) (2, 2, 0) (2, 2, 0) (5, 0, 0)

【问题讨论】:

  • 这有什么令人困惑的地方?

标签: c++ memoization


【解决方案1】:

为避免重复,您需要强加一个排序,例如,如果您之前使用分数 3,则不允许使用分数 7

void out(int score, int two, int three, int seven, int maxscore)
{
    ...
    else {
        if (maxscore >= 7) output(score-7, two, three, seven+1, 7);
        if (maxscore >= 3) output(score-3, two, three+1, seven, 3);
        if (maxscore >= 2) output(score-2, two+1, three, seven, 2);
    }
}

在这个问题中使用记忆化会更复杂(甚至可能不是那么有用),因为您正在寻找枚举所有解决方案(不仅仅是计算它们)。

memoization 的想法是保留一个表以避免重新计算相同的子问题。在这种情况下,子问题由分数和您允许使用的最大分数定义,但是解决方案还需要考虑您已经使用了多少个二三和七,如果您还将它们添加到键中,那么每个密钥只会被访问一次(因此尝试记住它没有意义)。

如果您只需要计算有多少种不同的方法可以达到分数,情况就不同了,因为在这种情况下,子问题的解决方案只是一个数字,您可以用它来解决原来的问题。

【讨论】:

    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    相关资源
    最近更新 更多