【发布时间】:2015-12-08 18:59:24
【问题描述】:
我刚开始学习动态编程,我刚刚尝试了一个基于 DP 的简单问题,在 Spoj 上。链接-http://www.spoj.com/problems/MST1/
这是问题陈述 -
对一个正整数,您可以执行以下 3 项中的任何一项 步骤。
1.) 减去 1。 (n = n - 1)
2.) 如果它可以被 2 整除,则除以 2。(如果 n % 2 == 0 ,则 n = n / 2)
3.) 如果它可以被 3 整除,则除以 3。(如果 n % 3 == 0 ,则 n = n / 3)
给定一个正整数 n,你的任务是找到最小的 n 到 1 的步骤。
输入:
输入包含整数 T (1 ≤ T ≤ 100) 个测试用例。 第二行输入是 N (0
输出:
对于每个案例,打印案例编号和最小步骤。
这是我的代码 -
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
// Memo Function returns the smallest number of steps possible for integer a
int memo(int a, int mem[]);
int mem[20000010];
int main() {
int t;
scanf("%i", &t);
for(int i = 1; i <= t; i++) {
int n;
scanf("%i", &n);
memset(mem, -1, sizeof(mem));
mem[1] = 0;
printf("Case %i: %i\n", i, memo(n, mem));
}
return 0;
}
int memo(int a, int mem[]) {
if (mem[a] != -1) return mem[a]; // If the value of smallest steps have already been calculated
int r; // Current Lowest number of steps
r = memo(a - 1, mem) + 1;
if (a % 2 == 0) r = min(r, memo(a/2, mem) + 1);
if (a % 3 == 0) r = min(r, memo(a/3, mem) + 1);
mem[a] = r;
return r;
}
我在 Internet 和 StackOverflow 上查找了此错误,我发现当我们尝试访问尚未分配的内存时可能会发生此错误,例如访问 10 元素数组的第 11 个元素.但我认为情况并非如此。
另外,我认为问题的上限是 2*10^7,数组也是全局的,所以应该不是问题。也许我使用 memset 函数的方式存在一些问题?我真的不知道!
任何帮助将不胜感激!感谢阅读!
【问题讨论】: