C++ C++;多维结构数组

C++ C++;多维结构数组,c++,memory-management,recursion,C++,Memory Management,Recursion,我正在写一个程序,计算所有具有n个节点和高度k的二叉树。每个节点都有0或2个子节点。这个程序可以运行,但我想添加一些备忘录,因为对于某些特定的n和k,答案总是相同的 我可以创建一个多维数组对,但我现在已经有了有用的结构。我如何声明和使用这个mem变量。我没有找到一个好的答案。我理解指针,但我更喜欢没有内存管理的方法 这是一个来自USACO培训计划的练习 #include <iostream> #include <fstream> #include <string&g

我正在写一个程序,计算所有具有n个节点和高度k的二叉树。每个节点都有0或2个子节点。这个程序可以运行,但我想添加一些备忘录,因为对于某些特定的n和k,答案总是相同的

我可以创建一个多维数组对,但我现在已经有了有用的结构。我如何声明和使用这个mem变量。我没有找到一个好的答案。我理解指针,但我更喜欢没有内存管理的方法

这是一个来自USACO培训计划的练习

#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
using namespace std;

struct state {
    int down, half;
    state(int d, int h) : down(d), half(h) {}
    int valid() {
        return down != -1 && half != -1;
    }
};

state mem[200][100];

state cnt(int n, int k)
{
    if (mem[n][k].valid())
        return mem[n][k];
    if (n == 1)
        return state(k == 1, k != 1);
    if (n > pow(2, k) - 1)
        return state(-1, -1);

    state total(0, 0);
    for (int i = 1; i < n - 1; ++i) {
        state left = cnt(i, k - 1);
        state right = cnt(n - i - 1, k - 1);

        if (left.valid() && right.valid()) {
            total.down += left.down * right.down +
                          left.down * right.half +
                          left.half * right.down;
            total.half += left.half * right.half;
        }
    }

    return mem[n][k] = state(total.down % 9901, total.half % 9901);
}

int main()
{
    ofstream fout ("nocows.out");
    ifstream fin ("nocows.in");

    int n, k;
    fin >> n >> k;

    for (int i = 0; i <= n; ++i)
        for (int j = 0; j <= k; ++j)
            mem[i][j] = state(-1, -1);

    cout << cnt(n, k).down << endl;

    return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
结构状态{
整数向下,一半;
状态(intd,inth):向下(d),半(h){
int valid(){
向下返回!=-1&&half!=-1;
}
};
州议员[200][100];
状态cnt(整数n,整数k)
{
if(mem[n][k].valid())
返回mem[n][k];
如果(n==1)
返回状态(k==1,k!=1);
如果(n>pow(2,k)-1)
返回状态(-1,-1);
州总数(0,0);
对于(int i=1;i>n>>k;

对于(int i=0;i可以使用向量的
向量

std::vector<std::vector<state> > mem;

您可以使用向量的
向量

std::vector<std::vector<state> > mem;

谢谢你的快速反应。这是我需要的,但是你或者其他人能解释为什么数组声明不起作用吗?谢谢你的快速反应。这是我需要的,但是你或者其他人能解释为什么数组声明不起作用吗?