题意:
解法:
d[i][0/1]表示前i列合法,第i列为颜色k=0/1的方案数,
在[x,y]范围内枚举j,设当前为d[i][k],
那么d[i+j][k^1]=min(d[i+j][k^1],d[i][k]+([i+1,j]颜色变成(k^1)的代价));
code:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define PI pair<int,int>
const int maxm=2e3+5;
char s[maxm][maxm];
int sum[maxm][2];
int a[maxm][2];
int d[maxm][2];
int n,m,x,y;
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
cin>>n>>m>>x>>y;
for(int i=1;i<=n;i++){
cin>>(s[i]+1);
for(int j=1;j<=m;j++){
if(s[i][j]=='#'){
a[j][0]++;
}else{
a[j][1]++;
}
}
}
for(int i=1;i<=m;i++){
sum[i][0]=sum[i-1][0]+a[i][0];
sum[i][1]=sum[i-1][1]+a[i][1];
}
for(int i=1;i<=m;i++)d[i][0]=d[i][1]=1e18;
d[0][0]=d[0][1]=0;
for(int i=0;i<=m;i++){
for(int k=0;k<2;k++){
if(d[i][k]==1e18)continue;
for(int j=x;j<=y&&i+j<=m;j++){
d[i+j][k^1]=min(d[i+j][k^1],d[i][k]+sum[i+j][k^1]-sum[i][k^1]);
}
}
}
cout<<min(d[m][0],d[m][1])<<endl;
return 0;
}