使用动态编程方法计算函数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 />
我得到了完全错误的想法或正确地做了,我不知道= [这也是对决赛的修改。
答案 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