题意:n行m列(n,m<=1e3) 要求同一列都相等 为'.'||'#' && x<=连续相等的列<=y 求最小代价
最后一列要么为'.' 或者 '#' 容易想到DP,d[i][2]:把前i列变为合法&&最后一列为'.'||'#'的最小代价
按和最后一列颜色相等长度k=x~y转移,d[i][0]=min(d[i-k][1]+f[i-k+1~i][0])
#include <bits/stdc++.h>
using namespace std;
const int N=2e3+20;
const int inf=1e6;
int n,m,x,y,ans;
char s[N][N];
int f[N][2];//把前i列边为.或者#需要代价
int d[N][2];//把前i列变为合法&&最后一列为'.'||'#'的最小代价
int main()
{
while(cin>>n>>m>>x>>y)
{
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
{
scanf("%s",s[i]+1);
for(int j=1;j<=m;j++)
{
if(s[i][j]=='#')
f[j][0]++;
else
f[j][1]++;
}
}
for(int j=1;j<=m;j++)
{
f[j][0]=f[j][0]+f[j-1][0];
f[j][1]=f[j][1]+f[j-1][1];
}
d[0][0]=d[0][1]=0;
for(int i=1;i<=m;i++)
{
d[i][0]=d[i][1]=inf;
for(int k=x;k<=y&&k<=i;k++)
{
d[i][0]=min(d[i][0],d[i-k][1]+f[i][0]-f[i-k][0]);
d[i][1]=min(d[i][1],d[i-k][0]+f[i][1]-f[i-k][1]);
}
}
int ans=min(d[m][0],d[m][1]);
cout<<ans<<endl;
}
return 0;
}