贪心+记忆化 求调
查看原帖
贪心+记忆化 求调
1054952
zzCX_df楼主2025/8/4 18:26
#include <bits/stdc++.h>

using namespace std;

const int N = 10;
int n = 8, k, a[N][N], s[N][N], mem[N][N][N][N][20];

inline void init() {
    for (int i = 1; i <= n; i++)
        s[1][i] = s[1][i - 1] + a[1][i];
    for (int i = 1; i <= n; i++)
        s[i][1] = s[i - 1][1] + a[i][1];
    for (int i = 2; i <= n; i++) for (int j = 2; j <= n; j++)
        s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];    
}

inline int calc(int lx, int ly, int rx, int ry) {
    return s[rx][ry] - s[lx - 1][ry] - s[rx][ly - 1] + s[lx - 1][ly - 1];
}

inline int dfs(int lx, int ly, int rx, int ry, int cnt) {
    if (mem[lx][ly][rx][ry][cnt] != -1)
        return mem[lx][ly][rx][ry][cnt];
    if (cnt == k)
        return calc(lx, ly, rx, ry) * calc(lx, ly, rx, ry);
    int sum = 1 << 30, minn = 1 << 30, ty;
    for (int i = ly; i < ry; i++) if (2 * calc(lx, ly, rx, i) * calc(lx, i + 1, rx, ry) < minn) {
        minn = 2 * calc(lx, ly, rx, i) * calc(lx, i + 1, rx, ry);
        ty = i;
    }
    sum = min(sum, min(dfs(lx, ly, rx, ty, cnt + 1) + calc(lx, ty + 1, rx, ry) * calc(lx, ty + 1, rx, ry), dfs(lx, ty + 1, rx, ry, cnt + 1) + calc(lx, ly, rx, ty) * calc(lx, ly, rx, ty)));
    minn = 1 << 30;
    for (int i = lx; i < rx; i++) if (2 * calc(lx, ly, i, ry) * calc(i + 1, ly, rx, ry) < minn) {
        minn = 2 * calc(lx, ly, i, ry) * calc(i + 1, ly, rx, ry);
        ty = i;
    }
    sum = min(sum, min(dfs(lx, ly, ty, ry, cnt + 1) + calc(ty + 1, ly, rx, ry) * calc(ty + 1, ly, rx, ry), dfs(ty + 1, ly, rx, ry, cnt + 1) + calc(lx, ly, ty, ry) * calc(lx, ly, ty, ry)));
    // printf("%d %d %d %d %d\n", lx, ly, rx, ry, sum);
    mem[lx][ly][rx][ry][cnt] = sum;
    return sum;
} 

int main() {
    memset(mem, 255, sizeof(mem));
    scanf("%d", &k);
    for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++)
        scanf("%d", &a[i][j]);
    init();
    printf("%d\n", dfs(1, 1, n, n, 1));
    return 0;
}

不需要《代码食粮》(已过) 只需《精神食粮》

2025/8/4 18:26
加载中...