c++ - 计算斯特林数的动态规划方法

标签 c++ c algorithm dynamic-programming non-recursive

int s_dynamic(int n,int k) {
    int maxj = n-k;

    int *arr = new int[maxj+1];

    for (int i = 0; i <= maxj; ++i)
        arr[i] = 1;

    for (int i = 1; i <= k; ++i)
        for(int j = 1; j <= maxj; ++j)
            arr[j] += i*arr[j-1];

    return arr[maxj];
}

这是我使用动态规划确定斯特林数的尝试。

定义如下:

S(n,k) = S(n-1,k-1) + k S(n-1,k), if 1 < k < n

S(n,k) = 1, if k=1 ou k=n

看起来不错,对吧?除非我运行单元测试...

partitioningTest ..\src\Test.cpp:44 3025 == s_dynamic(9,3) expected:    3025    but was:    4414    

谁能看出我做错了什么?

谢谢!

顺便说一句,这是递归解决方案:

int s_recursive(int n,int k) {
    if (k == 1 || k == n)
        return 1;

    return s_recursive(n-1,k-1) + k*s_recursive(n-1,k);
}

最佳答案

发现错误。 您已经计算了 k=1 的动态斯特林数数组(对于所有 n,S(n,1)=1)。 您应该开始计算 S(n,2) - 即:

for (int i = 2; i <= k; ++i) //i=2, not 1
  for(int j = 1; j <= maxj; ++j)
    arr[j] += i*arr[j-1];

关于c++ - 计算斯特林数的动态规划方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5133050/

相关文章:

c++ - Qt 在 QtWebEngine View 中显示 QImage 或像素图(从 C++ 到 HTML)

algorithm - 迭代求解流体问题中的未知数

c++ - 字符串解析的优雅解决方案

c++ - Qt5 C++ 自动点击鼠标

c++ - const 对和 const 对之间的区别

c - "The only operator that gives back a value is the de-referencing operator"

c - 如何逐行读取.txt文件到二叉搜索树

algorithm - 双正方形 : counting numbers which are sums of two perfect squares

c++ - OpenCV 表单应用-Mat转Grayscale

c - "array"和 "&array[0]"可以完全互换吗?