You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现二维矩阵的对角线遍历填充(非行/列优先)

对角线方向填充DP矩阵的循环实现

下面针对两种常见的对角线填充场景,给出具体的循环实现代码:

场景1:按子问题长度递增填充(区间DP常用)

这种方式适用于区间类DP问题(比如最长回文子串、矩阵链乘法),先填充所有长度为1的子问题(主对角线),再依次填充长度更长的对角线,直到覆盖整个矩阵。

Python 代码

n = 5  # 矩阵的边长
dp = [[0] * n for _ in range(n)]

# 按子问题长度从1到n遍历
for length in range(1, n + 1):
    # 遍历当前长度下所有合法的起始行i
    for i in range(n - length + 1):
        j = i + length - 1  # 对应对角线的列索引
        # 在这里编写你的DP状态转移逻辑
        dp[i][j] = 你的计算值

C++ 代码

int n = 5;
vector<vector<int>> dp(n, vector<int>(n, 0));

// 遍历子问题长度,从1到n
for (int length = 1; length <= n; ++length) {
    // 遍历当前长度对应的所有起始行
    for (int i = 0; i <= n - length; ++i) {
        int j = i + length - 1;
        // 写入DP状态转移逻辑
        dp[i][j] = /* 你的计算逻辑 */;
    }
}

场景2:右上→左下方向填充对角线

如果需要从矩阵右上角开始,依次向左下方向填充每条对角线(比如某些二维DP问题需要依赖右上角/右下角的状态),可以用偏移量遍历的方式:

Python 代码

n = 5
dp = [[0] * n for _ in range(n)]

# 遍历所有可能的偏移量,覆盖所有右上→左下的对角线
for offset in range(2 * n - 1):
    # 确定当前对角线的行索引范围
    start_i = max(0, offset - (n - 1))
    end_i = min(offset, n - 1)
    for i in range(start_i, end_i + 1):
        j = offset - i
        if 0 <= j < n:
            # 编写DP状态转移逻辑
            dp[i][j] = 你的计算值

C++ 代码

int n = 5;
vector<vector<int>> dp(n, vector<int>(n, 0));

// 遍历偏移量,覆盖所有右上→左下的对角线
for (int offset = 0; offset < 2 * n - 1; ++offset) {
    int start_i = max(0, offset - (n - 1));
    int end_i = min(offset, n - 1);
    for (int i = start_i; i <= end_i; ++i) {
        int j = offset - i;
        if (j >= 0 && j < n) {
            // 写入DP状态转移逻辑
            dp[i][j] = /* 你的计算逻辑 */;
        }
    }
}

根据你的DP问题依赖关系,选择对应的填充方式即可。

内容的提问来源于stack exchange,提问作者Harsh Anmol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:14:58