动态规划求解算法

时间:2014-12-29 22:03:11

标签: algorithm

使用动态编程方法计算函数H的值 H(7) 定义为 H(1)= 2,H(2)= 3 对于所有整数i> 2 ,我们有: 的 H(I)= H(I-​​2)-H(I-1)2。

我已经抬头,观看视频并阅读有关动态编程的内容。但仍然在努力解决上述问题。我理解你通过预先解决较小的问题来解决主要问题。然后你有更多的机会解决主要问题,因为你可以参考你以前的创始人。您发现的这些先前结果会传递给结果,但这是我无法解决的问题。

H(1)= H(1-2)-H(1-1)2。
H(2)= H(2-2)-H(2-1)2。
H(3)= H(3-2)-H(3-1)2。
H(4)= H(4-2)-H(4-1)2。
H(5)= H(5-2)-H(5-1)2。
H(6)= H(6-2)-H(6-1)2。

我假设这些的简单计算应该放在一个表格中,然后我会以某种方式使用这些信息然后计算出 H(7)。< BR />

我得到了完全错误的想法或正确地做了,我不知道= [这也是对决赛的修改。

4 个答案:

答案 0 :(得分:3)

你的任务与斐波纳西相似:) 首先,我将向您解释斐波纳契。

F(1)= 1
F(2)= 1
F(N)= F(N-1)+ F(N-2),对于每N> 1。 2

前几个斐波那契数字:
F(1)= 1
F(2)= 1
F(3)= F(2)+ F(1)= 2
F(4)= F(3)+ F(2)= 3
F(5)= F(4)+ F(3)= 5
...

您可以在http://en.wikipedia.org/wiki/Fibonacci_number

上看到更多信息 Fibonacci数的Fibonacci序列由递归关系定义。 Fibonacci序列是递归序列。

每次递归必须具有:
1)基础案例
2)复发关系

对于Fibonacci,基本情况为: F(1),等于 1 F(2),也等于<强> 1 即可。递归关系是&#34;连接&#34;相同问题的较小实例。如果你想知道 F(N)的斐波纳契数,你必须知道 F(N - 1) F(N - 2),< / strong>适用于所有 N&gt; 2 ,就是这样。在Fibonacci的情况下,递归关系是 F(N)= F(N-1)+ F(N-2)

这是代码:

#include <cstdio>
#include <cstdlib>

using namespace std;

int f(int n) {

    //printf("n = %d\n", n);
    if(n == 1 || n == 2) // base case
        return 1;
    return f(n - 1) + f(n - 2); // recurrence relation

}

int main() {

    int n; scanf("%d", &n);
    printf("%d\n", f(n));

    return 0;
}

如果你删除被注释的printf,你会看到很多Fibonacci的值被一遍又一遍地计算,这是非常低效的。尝试为 F(45)运行此代码,您将会发现为什么效率非常低。

这就是动态编程的用武之地。正如你所看到的,许多斐波纳契值是一遍又一遍地计算的,我们可以使用memoization将它们保存在表中,如果我们需要它们,我们可以从表中返回它们。这是代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;
const int N = 50;

long long memo[N];

long long f(int n) {
    if(memo[n] != -1) // if we already computed the value of f(N), then return that value
        return memo[n];
    return memo[n] = f(n - 1) + f(n - 2); // else compute the value, and save it into the table
}

int main() {

    memset(memo, -1, sizeof(memo));

    memo[1] = memo[2] = 1; // add answer for base case to the table

    int n; scanf("%d", &n);
    printf("%lld\n", f(n));

    return 0;
}

最后,你的问题。

作为Fibonacci,您可以保存 h(N)的计算值。这是一个代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;
const int N = 25;

int check, memo[N];

int f(int x) {
    if(memo[x] != check) // if f(n) was already computed
        return memo[x]; // return computed value
    return memo[x] = f(x - 2) - f(x - 1) + 2; // else compte given value and add it to a table
}

int main() {

    memset(memo, 63, sizeof(memo)); // very big number, if the value of h(n) is different then that very big number, then we know we have computed the value for h(n)
    check = memo[0];

    memo[1] = 2; // base case
    memo[2] = 3; // base case

    int n; scanf("%d", &n);
    printf("%d\n", f(n));

    return 0;
}

答案 1 :(得分:1)

你得到了

H(1)=2
H(2)=3

根据该信息和H(i)的公式,您可以如下计算H(3)

H(3) = H(3-2) - H(3-1) + 2 = H(1) - H(2) + 2 = 2 - 3 + 2 = 1

冲洗并重复。

答案 2 :(得分:1)

H(1)= 2
H(2)= 3
H(3)= H(1)-H(2)+ 2 = 2-3 + 2 = 1 H(4)= H(2) - H(3)+ 2 = 3 - 1 + 2 = 4
H(5)= H(3)-H(4)+ 2 = 1-4 + 2 = -1 H(6)= H(4)-H(5)+ 2 = 4 - ( - 1)+ 2 = 7
H(7)= H(5)-H(6)+ 2 = -1-7 + 2 = -6
所以H(7)是-6

答案 3 :(得分:-1)

在浏览器中打开JavaScript控制台,然后输入:

function H(i) { return i==1 ? 2 : i==2 ? 3 : H(i-2)-H(i-1)+2 }

然后

H(7)

返回

-6