Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 为什么我的记忆计算失败了?_Algorithm_Dynamic Programming_Floating Accuracy - Fatal编程技术网

Algorithm 为什么我的记忆计算失败了?

Algorithm 为什么我的记忆计算失败了?,algorithm,dynamic-programming,floating-accuracy,Algorithm,Dynamic Programming,Floating Accuracy,我试图把一个二维递归问题变成一个动态规划问题。但结果是不同的 代码如下: import edu.princeton.cs.algs4.*; import java.util.Arrays; public class Test { public static double binomial(int N, int k, double p) { if(N == 0 && k == 0) return 1.0; if(N < 0 || k

我试图把一个二维递归问题变成一个动态规划问题。但结果是不同的

代码如下:

import edu.princeton.cs.algs4.*;
import java.util.Arrays;

public class Test {

    public static double binomial(int N, int k, double p) {
        if(N == 0 && k == 0) return 1.0;
        if(N < 0 || k < 0) return 0.0;
        return (1 - p)*binomial(N-1, k, p) + p*binomial(N-1, k-1, p);
    }

    public static double binomialm(int N, int k, double p) {
        if(N < 0 || k < 0) return 0.0;

        double[][] memory = new double[N+1][k+1];
        memory[0][0] = 1.0;
        memory[1][0] = 1 - p;
        memory[0][1] = 0.0;

        for(int i = 1; i <= N; i++) {
            for(int j = 1; j <= k; j++) {
                memory[i][j] = (1 - p)*memory[i-1][j] + p*memory[i-1][j-1];
            }
        }

        return memory[N][k];
    }

    static public void main(String args[]) {
        long stime, stime1, etime, etime1;
        double r, r1;
        stime = System.currentTimeMillis();
        r = binomial(10, 5, 0.25);
        etime = System.currentTimeMillis();
        System.out.println("Regular binomial: result = " + r + ", time = " + (etime - stime));
        stime1 = System.currentTimeMillis();
        r1 = binomialm(10, 5, 0.25);
        etime1 = System.currentTimeMillis();
        System.out.println("Memoized binomial: result = " + r1 + ", time = " + (etime1 - stime1));
    }
}
import-edu.princeton.cs.algs4.*;
导入java.util.array;
公开课考试{
公共静态双二项式(int N,int k,double p){
如果(N==0&&k==0)返回1.0;
如果(N<0 | | k<0)返回0.0;
收益率(1-p)*二项式(N-1,k,p)+p*二项式(N-1,k-1,p);
}
公共静态双二进制数(整数N,整数k,双p){
如果(N<0 | | k<0)返回0.0;
双精度[]内存=新双精度[N+1][k+1];
内存[0][0]=1.0;
内存[1][0]=1-p;
内存[0][1]=0.0;

对于(int i=1;i在您的记忆版本中,您的内部循环从
j=1
开始。因此,(2,0),(3,0),(4,0),…的值从未更改,它们在创建双数组时仍然是0.0。它们应该是1.0,-1.0,1.0

for(int i = 1; i <= N; i++) {
    memory[i][0] = (1 - p)*memory[i-1][0];
    for(int j = 1; j <= k; j++) {
        memory[i][j] = (1 - p)*memory[i-1][j] + p*memory[i-1][j-1];
    }
}

for(int i=1;i)知道并能正确教授动态规划的老师太少了,我已经非常尊敬任何试图学习动态规划的人了。:D如果有人有一个很好的链接,清楚地解释了DynaPro并系统地解释了其代码的编写,请给我命名并让我知道。