为什么我的程序输入失败?超过10 ^ 5

时间:2016-09-05 06:54:56

标签: c++ performance optimization dynamic-programming

我正在学习动态编程。我试图解决以下问题:

问题简介: 您将获得一个原始计算器,可以使用当前数字执行以下三个操作 x:将x乘以2,将x乘以3,或将x加1。您的目标是正整数n,找到从数字1开始获取数字n所需的最小操作数。

任务 给定整数n,计算获得数字n所需的最小操作数 从数字1开始。 输入由单个整数1 <1组成。 n&lt; 10 ^ 6。

var customReplace = function(str, subStr, color) {
    var words = str.split(' ');
    for (var i = words.length - 1; i >= 0; i--) {
        var word = words[i].replace(/<br>/g, '');
        if (word === subStr) {
            words[i] = '<span class="color-' + color + '">' + words[i] + '</span>';
        }
    }

    return words.join('');
}

此程序输入数大于10 ^ 5时失败。为什么? 我怎样才能改进代码?

1 个答案:

答案 0 :(得分:1)

您的问题在线:

std::list<int> path[number+1];
  1. 它在堆栈上创建一个std::list变量数组,因此如果数量很大,则堆栈溢出并出现段错误。
  2. 此代码收到GCC的警告:
      

    警告:ISO C ++禁止可变长度数组&#39;路径&#39; [-Wvla]

  3. 它也被clang拒绝:
      

    错误:非POD元素类型的可变长度数组&#st; :: list&#39;

  4. NOT 在堆栈上定义巨大的变量

    相反,您应该使用std::vector,例如将行更改为:

    std::vector<std::list<int>> path(number+1);
    

    然后你的问题就解决了。