说着题枚举k的原理是dp的看过来
查看原帖
说着题枚举k的原理是dp的看过来
1053567
__O_w_O__楼主2025/1/16 08:08

(为了防止有人掰扯我,这里只放出部分代码) 你见过谁家的dp,一:可以正着枚举k

 for (int k = 1; k <= n; k++) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (mp[i][k] + mp[k][j] < mp[i][j]) {
                    mp[i][j] = mp[i][k] + mp[k][j];
                }
            }
        }
    }

二:可以倒着枚举k

for (int k = n; k >= 1; k--) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (mp[i][k] + mp[k][j] < mp[i][j]) {
                    mp[i][j] = mp[i][k] + mp[k][j];
                }
            }
        }
    }

三:我甚至可以先枚举奇数的k,在枚举偶数的k

 for (int k = 1; k <= n; k += 2) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (mp[i][k] + mp[k][j] < mp[i][j]) {
                    mp[i][j] = mp[i][k] + mp[k][j];
                }
            }
        }
    }
    for (int k = 2; k <= n; k += 2) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (mp[i][k] + mp[k][j] < mp[i][j]) {
                    mp[i][j] = mp[i][k] + mp[k][j];
                }
            }
        }
    }
2025/1/16 08:08
加载中...