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

添加记忆-动态规划

秦经义
2023-03-14

现在,我已经挣扎了几个小时,试图弄清楚如何在我的解决方案中加入记忆。

问题

  1. 如何在解决方案中添加工作记忆。在这种情况下,我的错误在哪里?
  2. 对于如何添加记忆,是否有经验法则或指导原则。
OPT[N,P] = highest tower with N given persons and person P is at the top
----------------------------------------------------------
OPT[0,P]                                = 0
OPT[i,P] where person i can be above P  = max(OPT[i-1,i]+1,OPT[i-1,P])
OPT[i,P] else                           = OPT[i-1,P]
struct Person{
    int ht;
    int wt;
};

// Without Memoization
int circusTower(int n, Person* top, std::vector<Person>& persons){
    if (n == 0)
        return 0;

    if (top == NULL || top->ht > persons[n - 1].ht && top->wt > persons[n - 1].wt)
        return max(circusTower(n - 1, &persons[n - 1], persons) + 1, circusTower(n - 1, top, persons));
    else
        return circusTower(n - 1, top, persons);
}

// With Memoization
int circusTower(int n, Person* top, std::vector<Person>& persons, std::vector<int>& memo){
    if (n == 0)
        return 0;

    int result;
    if (memo[n-1] == 0) {
        if (top == NULL || top->ht > persons[n - 1].ht && top->wt > persons[n - 1].wt)
            result = max(circusTower(n - 1, &persons[n - 1], persons, memo) + 1,
                         circusTower(n - 1, top, persons, memo));
        else
            result = circusTower(n - 1, top, persons, memo);

        memo[n - 1] = result;
        return result;
    } else {
        return memo[n-1];
    }
}
int main(){
    std::vector<Person> persons = { {65, 100},{100, 150},{56, 90}, {75, 190}, {60, 95},{68, 110} };
    std::stable_sort(persons.begin(), persons.end(), sortByWt);
    std::stable_sort(persons.begin(), persons.end(), sortByHt);

    std::vector<int> memo(6,0);

    //Without memoization
    cout << circusTower(6, NULL, persons) << endl;
    //With memoization
    cout << circusTower(6, NULL, persons, memo) << endl;
}

在上面main内部的示例中,正确的结果是5。我的常规解决方案(没有记忆)打印出5个,但有了记忆,它打印出6个。

共有1个答案

贲绪
2023-03-14

您的方法依赖于3个参数,但您仅从第一个参数n进行记忆

实际上,在您的示例中,第三个(Persons)是恒定的,但第二个(Top)在递归调用期间会发生变化。

因此,由于您的memotion,以下两个值返回相同的值:

    null
 类似资料:
  • 本文向大家介绍动态规划和带记忆递归的区别相关面试题,主要包含被问及动态规划和带记忆递归的区别时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 自顶而下和自底而上

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

  • 问题内容: 我的代码中有一些函数,使用记忆很有意义(甚至是强制性的)。 我不想为每个功能分别手动实现。有什么办法(例如在Python中),我可以只使用注释或做其他事情,以便在需要的地方自动获得这些注释? 问题答案: Spring 3.1现在提供了一个注释,它可以做到这一点。 顾名思义,@Cacheable用于划分可缓存的方法-即将结果存储到缓存中的方法,以便在后续调用(具有相同参数)时返回缓存中的

  • 你和你的朋友开车去提华纳度春假。你在为旅行存钱,所以你想把路上的油费降到最低。为了最小化你的汽油成本,你和你的朋友整理了以下信息。首先,你的汽车可以可靠地行驶m英里的油箱(但没有进一步)。你的一个朋友从网上挖掘了加油站的数据,并绘制了你路线上的每一个加油站,以及该加油站的汽油价格。具体而言,他们创建了一个从最近到最远的n+1个加油站价格列表,以及两个相邻加油站之间的n个距离列表。塔科马是0号加油站

  • 问题内容: 我不想要做的是在地图上显示从某些移动设备上选择的位置。有关位置的数据在那里。 我这里需要根据从服务器接收到的数据在地图上添加标记。 假设我已经将位置数据 ({Lat,Lang}) 设置为 状态标记, 然后如何添加它以显示在地图中。 我的地图代码如下! 使用过的npm包:-谷歌地图反应 问题答案: 您可以尝试: 如果有错误,也请在此处显示,我们稍后可以修复 =========== 标记点

  • 问题内容: 我正在考虑减少使用。js(看起来不错),但我们的网站要求在初始页面加载后动态加载某些样式。但是,似乎所有LESS样式表必须在less.js脚本加载之前先加载。即这有效 但是如果换行,它将失败,除非正确订购,否则Firefox和chrome都不会尝试加载“style.less”。在本教程中明确指出了订购要求。 有什么方法可以在初始页面加载后加载更少的样式表? - 保存您的LESS代码时,