【发布时间】:2014-11-17 10:42:40
【问题描述】:
问题在于计算所有可能的结束位置以及每个位置存在多少组合。
给定起始位置x=0、轨道长度m 和跳跃列表。返回区间 [-m/2,+m/2] 上每个位置的可能结束数。跳跃必须按照给定的顺序进行,但可以以消极或积极的方式完成。
例如:
L = 40
jumps = 10, 10
解决方案:
-20 : 1 (-10, -10)
0 : 2 (-10,+10 & +10,-10)
20 : 1 (+10,+10)
(需要的输出只有一对“位置:#combinations”)
我做了一个简单的递归,结果还可以。 但在大量数据中,执行时间是几分钟或几小时。 我知道使用动态编程可以在几秒钟内得到解决方案,但我不知道在这种情况下如何应用动态。
这是我实际的递归函数:
void escriuPosibilitats(queue<int> q, map<int,int> &res, int posicio, int m) {
int salt = q.front();
q.pop();
if(esSaltValid(m,posicio,-salt)) {
int novaPosicio = posicio - salt;
if(q.empty()) {
res[novaPosicio]++;
} else {
escriuPosibilitats(q,res,novaPosicio,m);
}
}
if(esSaltValid(m,posicio,salt)) {
int novaPosicio = posicio + salt;
if(q.empty()) {
res[novaPosicio]++;
} else {
escriuPosibilitats(q,res,novaPosicio,m);
}
}
}
- 其中
q是剩余跳转的队列。 -
res是主要解决方案。 -
posicio是实际位置。 -
m是轨道的长度。 - 其中
esSaltValid是一个检查跳转是否在轨道长度范围内有效的函数。
PD:对不起我的英语水平。我试图改善我的问题!谢谢=)
【问题讨论】:
标签: c++ algorithm dynamic-programming