题解:AT_abc442_f [ABC442F] Diagonal Separation 2
F 题题解
前言:比 E 简单
题意:有一个
- 每行存在整数
k (0 \leq k \leq N ),前k 个方格白,其余为黑; -
每列存在整数
k (0 \leq k \leq N ),前k 个方格白,其余为黑。求最少修改次数。
思路:第一眼能看出核心是处理行列约束,用
每行合法状态是选分界点
不妨设
#include<bits/stdc++.h>
#define ll long long
using namespace std;
char a[5005][5005];
int s[5005][5005],f[5005][5005];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%s",a[i]+1);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
s[i][j]=s[i][j-1]+(a[i][j]=='#'?1:0);
}
}
memset(f,0x3f,sizeof(f));
f[0][n]=0;
for(int i=1;i<=n;i++)
{
int minn=1e9;
for(int j=n;j>=0;j--)
{
minn=min(minn,f[i-1][j]);
f[i][j]=min(f[i][j],minn+s[i][j]+(n-j-(s[i][n]-s[i][j])));
}
}
int ans=1e11;
for(int i=0;i<=n;i++)
{
ans=min(ans,f[n][i]);
}
cout<<ans;
return 0;
}