[CF1198D] Rectangle Painting 1

[CF1198D] Rectangle Painting 1 - dp

Description

(n imes n) 矩阵只含 .#,请用价值和最少的一堆长方形覆盖所有的 #,一个长方形的价值是长与宽的最大值 ((1le nle 50))

Solution

(f[il][ir][jl][jr]) 为处理掉这个矩形区域的最小代价

记忆化搜索即可

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 55;
int n, m;
int f[N][N][N][N];
char s[N][N];

int solve(int il, int ir, int jl, int jr)
{
    if (~f[il][ir][jl][jr])
        return f[il][ir][jl][jr];
    if (il == ir && jl == jr)
        return s[il][jl] == '#';
    int ans = max(ir - il + 1, jr - jl + 1);
    for (int i = il; i < ir; i++)
        ans = min(ans, solve(il, i, jl, jr) + solve(i + 1, ir, jl, jr));
    for (int j = jl; j < jr; j++)
        ans = min(ans, solve(il, ir, jl, j) + solve(il, ir, j + 1, jr));
    return f[il][ir][jl][jr] = ans;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> s[i] + 1;
    memset(f, -1, sizeof f);
    cout << solve(1, n, 1, n) << endl;
}`
``
原文地址:https://www.cnblogs.com/mollnn/p/14472446.html