标签:
题目链接:http://codeforces.com/problemset/problem/225/C
题目大意:给你一个矩阵,矩阵中只有#和.两种符号。现在我们希望能够得到一个新的矩阵,新的矩阵满足每一列都只有一种符号,并且连续相同符号的列数在区间[x,y]之间。
解:
现将列中的点统计出来,然后就是枚举把列数在x到y之间的需要更改为点的统计出来。这些点染上白色。
然后再将列数在x到y之间的需要更改为井号的点数统计出来,这些点染成黑色。
接下来就是DAG上的动态规划了,dp[i]代表从i到终点的最短路径。路径要求:相邻两个点的颜色不相同。
我是用的记忆化搜索,当然也很好改成递推。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <vector> 5 #include <map> 6 #include <set> 7 #include <bitset> 8 #include <cmath> 9 #include <numeric> 10 #include <iterator> 11 #include <iostream> 12 #include <cstdlib> 13 #include <functional> 14 #include <queue> 15 #include <stack> 16 #include <string> 17 using namespace std; 18 #define PB push_back 19 #define MP make_pair 20 #define SZ size() 21 #define ST begin() 22 #define ED end() 23 #define CLR clear() 24 #define ZERO(x) memset((x),0,sizeof(x)) 25 typedef long long LL; 26 typedef unsigned long long ULL; 27 typedef pair<int,int> PII; 28 const double EPS = 1e-8; 29 const int INF = 999999999; 30 const int MAX_N = 1111; 31 struct NODE{ 32 int l,r,val; 33 }; 34 35 vector<NODE> vec[MAX_N][2]; 36 int n,m,x,y; 37 int a[MAX_N],sum[MAX_N],sumn[MAX_N]; 38 int dp[MAX_N][2]; 39 40 int f(int st,int type){ 41 int res = INF; 42 if( dp[st][type]!=INF ){ 43 return dp[st][type]; 44 } 45 for(int j=0;j<vec[st][type].size();j++){ 46 if(vec[st][type][j].r==m) 47 res = min(res,vec[st][type][j].val); 48 } 49 for(int j=0;j<vec[st][type].size();j++) { 50 if(vec[st][type][j].r!=m) 51 res = min(res,vec[st][type][j].val+f(vec[st][type][j].r+1,1-type)); 52 } 53 return dp[st][type] = res; 54 } 55 56 int main(){ 57 scanf("%d%d%d%d",&n,&m,&x,&y); 58 ZERO(a); 59 for(int i=1;i<=n;i++){ 60 getchar(); 61 for(int j=1;j<=m;j++){ 62 char c = getchar(); 63 if( c==‘.‘ ){ 64 a[j]++; 65 } 66 } 67 } 68 69 for(int i=1;i<=m;i++){ 70 sum[i] = sum[i-1]+a[i]; 71 sumn[i] = sumn[i-1]+n-a[i]; 72 //dp[i] = INF; 73 } 74 75 for(int i=1;i<=m;i++){ 76 for(int j=x;j<=y;j++){ 77 NODE N; 78 N.l = i; 79 N.r = i+j-1; 80 if( N.r>m ) break; 81 N.val = sum[N.r] - sum[N.l-1]; 82 vec[N.l][0].PB(N); 83 N.val = sumn[N.r] - sumn[N.l-1]; 84 vec[N.l][1].PB(N); 85 } 86 } 87 for(int i=0;i<MAX_N;i++){ 88 dp[i][0] = dp[i][1] = INF; 89 } 90 int ans = f(1,0); 91 //for(int i=1;i<=m;i++) printf("%d ",dp[i]); puts(""); 92 //for(int i=1;i<=m;i++) dp[i] = INF; 93 ans = min(ans,f(1,1)); 94 //for(int i=1;i<=m;i++) printf("%d ",dp[i]); puts(""); 95 printf("%d\n",ans); 96 return 0; 97 }
标签:
原文地址:http://www.cnblogs.com/llkpersonal/p/4526917.html