C++ 我需要一些关于动态规划的建议
问题是: 哈娜是个数学创造者。最初,他有一个数字n。每次执行操作时,他都会删除任何元素x,使x>1,然后按顺序将3号插入相同的位置:地板(x/2)、x模块2、地板(x/2)。他必须继续此操作,直到收到满是0和1的列表 因此,列表是1索引的(列表的第一个索引是1)。实现一个函数sumofone来计算列表中l和r之间的数字1的总数 请注意:C++ 我需要一些关于动态规划的建议,c++,dynamic,large-data,C++,Dynamic,Large Data,问题是: 哈娜是个数学创造者。最初,他有一个数字n。每次执行操作时,他都会删除任何元素x,使x>1,然后按顺序将3号插入相同的位置:地板(x/2)、x模块2、地板(x/2)。他必须继续此操作,直到收到满是0和1的列表 因此,列表是1索引的(列表的第一个索引是1)。实现一个函数sumofone来计算列表中l和r之间的数字1的总数 请注意: 时限为2秒 0首先,除了几个设计缺陷之外,您还有一个严重的内存泄漏问题,因为您在没有正确删除的情况下堆分配了一个本地数组 string* memoize =
- 时限为2秒
- 0首先,除了几个设计缺陷之外,您还有一个严重的内存泄漏问题,因为您在没有正确删除的情况下堆分配了一个本地数组
不要以这种方式在本地执行此操作,请为此使用std::vector:string* memoize = new string[n+1];
auto memoize = std::vector<std::string>(n + 1);
接下来,您将为每个实际值请求一次又一次地重新创建数组。应避免这种情况,至少对于当前具有完全初始化阵列的解决方案,请使用hana阵列的更“全局”存储位置(预分配最大可能的N) 对于您实际的算法问题,这里没有更深入的数学见解,并且感觉原始问题的表述更为详细/精确…: 你将永远无法以可接受的方式用你目前的方法解决这个问题auto memoize=std::vector(n+1);
关键是:这是一个常见的对数问题类,参见二进制搜索示例。您应该尝试重新设计对递归函数调用访问的数组访问,以便始终通过函数调用访问第n个元素,并且只有前两个元素实际上是“具体的”。首先,如果没有更深入的分析,复杂性应该已经可以降低到O(log(n)*(r-l))左右。我会尝试向您发布解决方案,但请确保首先,您在此处提供了完整的问题描述 这可能是某个在线编码网站提出的问题。这些网站提出的问题旨在提供适用于小数据的简单解决方案,但对于大数据则会失败。这个问题的真正解决方案很可能不需要您尝试分配TB的内存。当你看到约束条件,如
范围达n
,这是一个绝对的赠品,解决方案需要某种数学技巧。是的,先生!这是完整的问题描述!如果你能给我一个解决办法,那就太好了。非常感谢。我找到了我自己的解决方案,所以你没有必要发布你的解决方案!我真的很感谢你的帮助!你的建议对我帮助很大!非常感谢你!2^50
auto memoize = std::vector<std::string>(n + 1);