[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;
}`
``