题目链接:http://codeforces.com/contest/225/problem/C

题目大意:

给出一个矩阵,只有两种字符'.'和'#',问最少修改多少个点才能让每一列的字符一致,且字符一致的连续的列的宽度在x和y之间。

解题思路:

先求出每列‘.’和'#'的前缀和,sum[i][0]表示前i列'#' 的前缀和,sum[i][1]表示前i列'.' 的前缀和 ,因为修改要求每列都保持一直,其实我们可以将每列都当成一个点来看,那样我们就相当于是在一维序列上操作了。

dp[i][0]表示最后一列为'.'的最优解,dp[i][1]表示最后一列为'#'的最优解 。

那么我们可以得到状态转移方程:

dp[i+j][0]=min(dp[i+j][0],dp[i][1]+sum[i+j][0]-sum[i][0]),x=<j<=y,0<=i<=m
dp[i+j][1]=min(dp[i+j][1],dp[i][0]+sum[i+j][1]-sum[i][1]),x=<j<=y,0<=i<=m

其实很好理解,dp[i+j][0]表示第i+j列为'.',那么可以由相差为j的第i列为'#'的状态推导过来,同时要将i+1~j的'#'都变为'.'

dp[i+j][1]同理。

代码:

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<string.h>
#include<cctype>
#include<math.h>
#include<stdlib.h>
#include<stack>
#include<queue>
#include<set>
#include<map>
#define lc(a) (a<<1)
#define rc(a) (a<<1|1)
#define MID(a,b) ((a+b)>>1)
#define fin(name) freopen(name,"r",stdin)
#define fout(name) freopen(name,"w",stdout)
#define clr(arr,val) memset(arr,val,sizeof(arr))
#define _for(i,start,end) for(int i=start;i<=end;i++)
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
typedef long long LL;
const int N=3e3+;
const LL INF64=1e18;
const int INF=0x3f3f3f3f;
const double eps=1e-; int dp[N][]; //dp[i][0]表示最后一列为'.'的最优解,dp[i][1]表示最后一列为'#'的最优解
int sum[N][]; //sum[i][0]表示前i列'#' 的前缀和,sum[i][1]表示前i列'.' 的前缀和 int main(){
memset(dp,0x3f,sizeof(dp));
FAST_IO;
int n,m,x,y;
cin>>n>>m>>x>>y;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
char x;
cin>>x;
if(x=='#')
sum[j][]++;
else
sum[j][]++;
}
}
for(int i=;i<=m;i++){
sum[i][]+=sum[i-][];
sum[i][]+=sum[i-][];
} dp[][]=dp[][]=;
for(int i=;i<=m;i++){
for(int j=x;j<=y;j++){
dp[i+j][]=min(dp[i+j][],dp[i][]+sum[i+j][]-sum[i][]);
dp[i+j][]=min(dp[i+j][],dp[i][]+sum[i+j][]-sum[i][]);
}
}
cout<<min(dp[m][],dp[m][])<<endl;
return ;
}

最新文章

  1. 禁用SQL Server Management Studio的IntelliSense
  2. 【Windows编程】系列第二篇:Windows SDK创建基本控件
  3. AdminLTE 2 开源模版
  4. VTK的学习资源
  5. Shader 之 顶点变形
  6. AX 2012 SSRS print setting-报表打印输出设置
  7. MFC的自定义消息的定义与使用
  8. C#按回车Enter使输入焦点自动跳到下一个TextBox的方法收集
  9. 疯狂位图之——位图实现12GB无重复大整数集排序
  10. qt cef嵌入web
  11. 【LCA】bzoj 2144:跳跳棋
  12. UPDATE和SELECT嵌套使用
  13. Andriod 中常见错误
  14. iOS工具种之16进制颜色转为UIColor
  15. cnblogs
  16. Exp3 免杀原理与实践 20164303 景圣
  17. Mvc_缓存浅谈
  18. eclipse自动添加注释
  19. PHP feof()函数
  20. HDU 1907 John (Nim博弈)

热门文章

  1. 【noip模拟】D(==)
  2. Maven问题合集
  3. Vuejs+axios+SpringMVC 1
  4. SQL复杂语句查询练习
  5. 为什么只有一个元素的tuple要加逗号?
  6. [Leetcode] Backtracking回溯法解题思路
  7. Oracle的基本语法,存储函数及触发器
  8. [Java] 理解JVM之三:垃圾回收机制
  9. 【转】Ubuntu+apache绑定多个域名
  10. 为什么JavaScript声明变量的时候鼓励加var关键字