题意:给你一个矩阵,只包含 '#' 和 '.',现在每一列必须相同,最多连续y列最少连续x列相同。
解题思路:3维dp,dp[i][j][k] 表示 第i列 ,状态j,是状态j的第K行。
解题代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // File Name: 225c.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月09日 星期一 09时49分05秒 4 #include<climits> 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 using namespace std; 26 char str[1005][1005]; 27 int dp[1005][2][1005]; 28 int cw[1005]; 29 int cb[1005]; 30 int main(){ 31 int n , m ,x ,y; 32 memset(dp,-1,sizeof(dp)) ; 33 scanf("%d %d %d %d",&n,&m,&x,&y); 34 for(int i = 1;i <= n;i ++) 35 { 36 scanf("%s",&str[i][1]); 37 } 38 for(int i = 1;i <= m;i ++) 39 { 40 for(int j = 1;j <= n;j ++) 41 { 42 if(str[j][i] == '#') 43 cw[i] ++ ; 44 } 45 cb[i] = n - cw[i]; 46 } 47 dp[1][0][1] = cb[1]; 48 dp[1][1][1] = cw[1]; 49 for(int i= 2;i <= m;i ++) 50 { 51 int mxcb = -1; 52 for(int j = 1;j <= y ;j ++) 53 { 54 if(dp[i-1][0][j] != -1) 55 { 56 dp[i][0][j+1] = dp[i-1][0][j] + cb[i]; 57 if(j >= x) 58 { 59 if(mxcb == -1) 60 mxcb = dp[i-1][0][j]; 61 else 62 mxcb = min(mxcb,dp[i-1][0][j]); 63 } 64 } 65 } 66 int mxcw = -1; 67 for(int j = 1;j <= y ;j ++) 68 { 69 if(dp[i-1][1][j] != -1) 70 { 71 dp[i][1][j+1] = dp[i-1][1][j] + cw[i]; 72 if(j >= x) 73 { 74 if(mxcw == -1) 75 mxcw = dp[i-1][1][j]; 76 else 77 mxcw = min(mxcw,dp[i-1][1][j]); 78 } 79 } 80 } 81 //printf("%d %d\n",mxcw,mxcb); 82 if(mxcw != -1) 83 dp[i][0][1] = mxcw + cb[i]; 84 if(mxcb != -1) 85 dp[i][1][1] = mxcb + cw[i]; 86 } 87 int ans = INT_MAX; 88 for(int i = 0 ;i < 2;i ++) 89 for(int j = x; j <= y; j ++) 90 { 91 if(dp[m][i][j] != -1) 92 ans = min(dp[m][i][j],ans); 93 } 94 /*for(int i = 1;i <= m;i ++) 95 { 96 for(int s = 0 ; s <= 1 ; s ++) 97 { 98 for(int j= 1;j <= y ;j ++) 99 printf("%d ",dp[i][s][j]); 100 printf("****"); 101 } 102 printf("\n"); 103 }*/ 104 printf("%d\n",ans); 105 return 0; 106 }
没有梦想,何谈远方