【问题标题】:Primitive calculator - Dynamic Programming原始计算器 - 动态规划
【发布时间】:2020-07-08 05:36:41
【问题描述】:

所以,问题任务是:

给定一个整数 ????,计算所需的最小操作数 获取号码???从数字 1 开始。

这是我的代码:

#include<bits/stdc++.h>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
    int n;
    cin >> n;
    vector<int> v(n+1);
    for(int i = 0; i < n+1; i++)
    {
        v[i] = 0;
    }
    v[1] = 1;
    for(int i = 1; i <= v.size() - 1; i++)
    {
        if((v[i + 1] == 0) || (v[i + 1] > v[i] + 1))
        {
            v[i + 1] = v[i] + 1;
        }
        if((2*i <= n) && (v[2*i] == 0 || v[2*i] > v[i] + 1))
        {
            v[2*i] = v[i] + 1;
        }
        if((3*i <= n) && (v[3*i] == 0 || v[3*i] > v[i] + 1))
        {
            v[3*i] = v[i] + 1;
        }
    }
    vector<int> solution;
    while(n > 1)
    {
        solution.push_back(n);
        if(v[n - 1] == v[n] - 1)
        {
            n = n-1;
        }
        else if(n%2 == 0 && v[n/2] == v[n] - 1)
        {
            n = n/2;
        }
        else if(n%3 == 0 && v[n/3] == v[n] - 1)
        {
            n = n/3;
        }
    }
    solution.push_back(1);
    reverse(solution.begin(), solution.end());
    for(size_t k = 0; k < solution.size(); k++)
    {
        cout << solution[k] << ' ';
    }
}

我无法找出任何错误。这没有给我任何输出。如果你能帮助我,那就太好了。 输入和输出已在此处显示:

输入:

5

输出:

3
1 2 4 5

所以,基本上你必须给出为 n 完成这项任务所需的操作数,并提供中间数的序列。

【问题讨论】:

  • 能否请您发布输入/输出和预期的输入/输出
  • 哪些操作有效?在用 C++ 编码之前,你打算使用什么算法?
  • 不相关:i &lt;= v.size() - 1 可以表达为i &lt; v.size() 更具可读性
  • @Yunnosch 是的,我尝试调试但找不到我的错。

标签: c++ dynamic-programming


【解决方案1】:

您的矢量v 有相当明显的越界访问。

for(int i = 1; i <= v.size() - 1; i++)
    ,,,
    v[3*i] = v[i] + 1;

3*i 显然比v 的大小在您的大部分循环中都大。

【讨论】:

  • 是的,我接受!我通过添加 3*i
  • 我明白了!我添加了这条线和宾果游戏!
猜你喜欢
  • 1970-01-01
  • 2016-08-24
  • 2016-08-29
  • 1970-01-01
  • 2012-03-26
  • 2013-11-27
相关资源
最近更新 更多