fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int main(){
  5.  
  6. ios_base::sync_with_stdio(false);
  7. cin.tie(0); cout.tie(0);
  8.  
  9. int n,m,x,y;
  10. cin>>n>>m>>x>>y;
  11. char val;
  12.  
  13. vector<vector<int> > dp(m,vector<int>(2,INT_MAX)),count(m,vector<int>(2,0));
  14. vector<vector<int> > MAT(n,vector<int>(m,0));
  15.  
  16. for(int i=0;i<n;i++){
  17.  
  18. for(int j = 0;j<m;j++){
  19. cin>>val;
  20. if(val=='.') MAT[i][j] = 1;
  21. }
  22.  
  23. }
  24.  
  25.  
  26. for(int j = 0;j<m;j++){
  27.  
  28. int mn = 0;
  29. for(int i = 0;i<n;i++) mn+=MAT[i][j];
  30.  
  31. count[j][1] = mn;
  32. count[j][0] = n - count[j][1];
  33. if(j!=0){
  34. count[j][0] += count[j-1][0];
  35. count[j][1] += count[j-1][1];
  36. dp[j][0] = count[j][0];
  37. dp[j][1] = count[j][1];
  38. }
  39.  
  40. }
  41.  
  42. dp[x-1][0] = count[x-1][0];
  43. dp[x-1][1] = count[x-1][1];
  44.  
  45.  
  46. for(int i = x;i<m;i++){
  47.  
  48. for(int j = i-1;j>=1;j--){
  49.  
  50. if(j+1>=x && i-j+1<=y){
  51.  
  52. dp[i][0] = min(dp[i][0],dp[j][1] + count[i][0] - count[j-1][0]);
  53. dp[i][1] = min(dp[i][1],dp[j][0] + count[i][1] - count[j-1][1]);
  54.  
  55. }
  56. }
  57.  
  58. }
  59.  
  60. cout<<min(dp[m-1][0],dp[m-1][1])<<'\n';
  61.  
  62. return 0;
  63. }
Success #stdin #stdout 0s 4440KB
stdin
2 5 1 1
#####
.....
stdout
5