qq_45992231 2021-08-15 12:30 采纳率: 0%
浏览 8
已结题

leetcode 576 dp 为什么这份代码的执行需要24ms 而官方题解中只要4ms,明明两者对三维数组的遍历情况是差不多的啊?

我的代码:

int MOD = 1000000007;

int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
    int dx[4] = { 0,0,-1,1 };
    int dy[4] = { -1,1,0,0 };
    long long dp[50 + 1][50 + 1][50 + 1];
    memset(dp, 0, sizeof(dp));
    for (int x = 0; x < m; x++)
    {
        for (int y = 0; y < n; y++)
        {
            for (int i = 0; i < 4; i++)
            {
                int newx = x + dx[i];
                int newy = y + dy[i];
                if ((newx < 0 || newx >= m) || (newy < 0 || newy >= n))
                {
                    dp[x][y][1]++;
                }
            }
        }
    }
    for (int i = 2; i <= maxMove; i++)
    {
        for (int x = 0; x < m; x++)
        {
            for (int y = 0; y < n; y++)
            {
                for (int j = 0; j < 4; j++)
                {
                    int newx = x + dx[j];
                    int newy = y + dy[j];
                    if ((newx >= 0 && newx < m) && (newy >= 0 && newy < n))
                    {
                        dp[x][y][i] = (dp[newx][newy][i - 1]%MOD-dp[newx][newy][i-2]%MOD+MOD
                        +dp[x][y][i]%MOD)%MOD;
                    }
                }
                dp[x][y][i] = (dp[x][y][i - 1]%MOD+dp[x][y][i]%MOD)%MOD;
                                                               
            }
        }
    }
    return dp[startRow][startColumn][maxMove];

}

官方代码:

int MOD = 1000000007;

int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
    int directions[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    int outCounts = 0;

    int dp[maxMove + 1][m][n];
    memset(dp, 0, sizeof(dp));
    dp[0][startRow][startColumn] = 1;
    for (int i = 0; i < maxMove; i++) {
        for (int j = 0; j < m; j++) {
            for (int k = 0; k < n; k++) {
                int count = dp[i][j][k];
                if (count > 0) {
                    for (int s = 0; s < 4; s++) {
                        int j1 = j + directions[s][0], k1 = k + directions[s][1];
                        if (j1 >= 0 && j1 < m && k1 >= 0 && k1 < n) {
                            dp[i + 1][j1][k1] = (dp[i + 1][j1][k1] + count) % MOD;
                        } else {
                            outCounts = (outCounts + count) % MOD;
                        }
                    }
                }
            }
        }
    }
    return outCounts;
}


  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 8月23日
    • 创建了问题 8月15日

    悬赏问题

    • ¥15 onlyoffice编辑完后立即下载,下载的不是最新编辑的文档
    • ¥15 求caverdock使用教程
    • ¥15 Coze智能助手搭建过程中的问题请教
    • ¥15 12864只亮屏 不显示汉字
    • ¥20 三极管1000倍放大电路
    • ¥15 vscode报错如何解决
    • ¥15 前端vue CryptoJS Aes CBC加密后端java解密
    • ¥15 python随机森林对两个excel表格读取,shap报错
    • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
    • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。