将递归转换为循环或其他更快的解决方案

时间:2018-03-20 17:28:55

标签: java recursion dynamic-programming

致力于改进部分代码。将这种方法更快的另一种方法是什么?递归:

 public static int MOD = 11380;
public static int[][][][] memo = new int[11][11][11][31];
static int ret;

public static int solve(int L1, int L2, int L3, int D) {
    if (D < 0) {
        return 0;
    }
    if (L1 + L2 + L3 == 0) {
        return 1;
    }

    ret = memo[L1][L2][L3][D];
    if (ret == 0) {
     //   ret = 0;

        for (int i = 0; i < L1; ++i) {
            for (int j = 0; j <= L2; ++j) {
                for (int k = 0; k <= L3; ++k) {
                    ret += solve(i, j, k, D - 1) *solve(L1 - 1 - i, L2 - j, L3 - k, D);
                    ret %= MOD;
                }
            }
        }

        for (int i = 0; i < L2; ++i) {
            for (int j = 0; j <= L3; ++j) {
                ret += solve(0, i, j, D - 1) * solve(L1, L2 - 1 - i, L3 - j, D);
                ret %= MOD;
            }
        }

        for (int i = 0; i < L3; ++i) {
            ret += solve(0, 0, i, D - 1)  * solve(L1, L2, L3 - 1 - i, D);
            ret%= MOD;
        }
    }

    return ret;
}

这部分代码在c ++中工作得非常快,但是现在需要转换成Java,但直接转换成Java代码导致花费更多时间......所以,现在寻找现有代码的改进。 UPD。 D - 深度,L1 - 量{},L2 - 量[]和L3 - 量()。 (0 <= L1,L2,L3 <= 10,0 <= D <= 30)这是来自争夺竞争的任务 here

0 个答案:

没有答案