【链接】 我是链接,点我呀:)

【题意】

让你把每一列都染成一样的颜色
要求连续相同颜色的列的长度都大于等于x小于等于y
问你最少的染色次数

【题解】

先求出每一列染成#或者.需要染色多少次
设f[0][i][j]表示前i列,以i为结尾的连续列长度为j的#列最少需要染色多少次
设f[1][i][j]表示前i列,以i为结尾的连续列长度为j的.列最少需要染色多少次
f[0][i][j]可以由f[0][i-1][j-1]转移过来
但是j==1的时候比较特殊
会由f[1][i-1][x..y]转移过来(由里面的最小值转移)
为了方便
所以在算f[1][i-1][x..y]的时候
可以把这些的最小值存在f[0][i][0]里面
这样就不用每次转移j的时候都重新求最小值了(不过临时求问题也不大)
最后取min(f[0][m][x..y],f[1][m][x..y])

【代码】

import java.io.*;
import java.util.*; public class Main { static InputReader in;
static PrintWriter out; public static void main(String[] args) throws IOException{
//InputStream ins = new FileInputStream("E:\\rush.txt");
InputStream ins = System.in;
in = new InputReader(ins);
out = new PrintWriter(System.out);
//code start from here
new Task().solve(in, out);
out.close();
} static int N = (int)1e3;
static class Task{
String []s;
int cost[][];
int f[][][]; public void solve(InputReader in,PrintWriter out) {
s = new String[N+10];
cost = new int[2][N+10];
f = new int[2][N+10][N+10];
int n,m,x,y;
n = in.nextInt();m = in.nextInt();x = in.nextInt();y = in.nextInt();
for (int i = 0;i <= n-1;i++) s[i] = in.next();
for (int i = 0;i < n;i++)
for (int j = 0;j < m;j++) {
char key = s[i].charAt(j);
if (key=='#')
cost[0][j+1]++;
}
for (int j = 1;j <= m;j++) cost[1][j] = n-cost[0][j];
for (int p = 0;p < 2;p++)
for (int i = 0;i <= N;i++)
for (int j = 0;j <= N;j++)
f[p][i][j] = (int)1e7;
f[0][1][1] = cost[0][1];
if (x<=1 && 1<=y) f[1][1][0] = cost[0][1]; f[1][1][1] = cost[1][1];
if (x<=1 && 1<=y) f[0][1][0] = cost[1][1]; for (int i = 2;i <= m;i++)
for (int j = 1;j <= y;j++){
f[0][i][j] = Math.min(f[0][i][j], f[0][i-1][j-1]+cost[0][i]);
if (x<=j && j<=y) f[1][i][0] = Math.min(f[1][i][0], f[0][i][j]); f[1][i][j] = Math.min(f[1][i][j], f[1][i-1][j-1]+cost[1][i]);
if (x<=j && j<=y) f[0][i][0] = Math.min(f[0][i][0], f[1][i][j]); //f[0][i][1] = min{f[1][i-1][1],f[1][i-1][2],f[1][i-1][3]...f[1][i-1][y]
//f[1][i][1] = min(f[0][i-1][1],f[0][i-1][2],f[0][i-1][3]...f[0][i-1][y]
}
int ans = (int)1e7;
for (int i = x;i <= y;i++) {
ans = Math.min(ans, f[1][m][i]);
ans = Math.min(ans, f[0][m][i]);
}
out.println(ans);
}
} static class InputReader{
public BufferedReader br;
public StringTokenizer tokenizer; public InputReader(InputStream ins) {
br = new BufferedReader(new InputStreamReader(ins));
tokenizer = null;
} public String next(){
while (tokenizer==null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(br.readLine());
}catch(IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
} public int nextInt() {
return Integer.parseInt(next());
}
}
}

【Codeforces 225C】Barcode的更多相关文章

  1. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  2. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  3. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  4. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

  5. 【codeforces 709B】Checkpoints

    [题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...

  6. 【codeforces 709C】Letters Cyclic Shift

    [题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...

  7. 【Codeforces 429D】 Tricky Function

    [题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...

  8. 【Codeforces 670C】 Cinema

    [题目链接] http://codeforces.com/contest/670/problem/C [算法] 离散化 [代码] #include<bits/stdc++.h> using ...

  9. 【codeforces 515D】Drazil and Tiles

    [题目链接]:http://codeforces.com/contest/515/problem/D [题意] 给你一个n*m的格子; 然后让你用1*2的长方形去填格子的空缺; 如果有填满的方案且方案 ...

随机推荐

  1. 获取Access数据里所有表的名称和表的字段

    -------------//获取Access数据库表名        public void GetTableName()        {                string connSt ...

  2. caffe to tensorflow alexnet model

    from kaffe.tensorflow import Network class AlexNet(Network): def setup(self): (self.feed('data') .co ...

  3. loj 101 最大流

    冬令营送到我脸上的20分都没拿全 心态爆炸 冬令营前一天学的dinic 后一天才发出来 #include<iostream> #include<cstdio> #include ...

  4. bzoj 4003 [JLOI2015]城池攻占 —— 左偏树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4003 其实蛮简单的,首先一个城市只会被其子树中的骑士经过,启发我们 dfs 序用可并堆合并子 ...

  5. POJ2449 Remmarguts' Date 第K短路

    POJ2449 比较裸的K短路问题 K短路听起来高大上 实际思路并不复杂 首先对终点t到其他所有点求最短路 即为dist[] 然后由起点s 根据当前走过的距离+dist[]进行A*搜索 第k次到达t即 ...

  6. JSP-Runoob:JSP 表单处理

    ylbtech-JSP-Runoob:JSP 表单处理 1.返回顶部 1. JSP 表单处理 我们在浏览网页的时候,经常需要向服务器提交信息,并让后台程序处理.浏览器中使用 GET 和 POST 方法 ...

  7. PCB 所建不凡 AWS 技术峰会2018 • 深圳站 2018.9.20

    在去[AWS 技术峰会2018 • 深圳站]之提前并没有AWS提前做功课,主要PCB这行业基本自己搭服务器搭应用,不会买云服务器.由于没用过企业级的云服务器,对云这方面还是了解还是非常有限的. 市面上 ...

  8. hibernate基础简单入门1---helloword

    1:目录结果 2:实体类(student.java) package com.www.entity; public class Student { private int id; private St ...

  9. [App Store Connect帮助]二、 添加、编辑和删除用户(4)更改用户的 App 访问权限

    您可以限制具有“App 管理”.“客户支持”.“开发者”.“营销”或“销售”职能的用户(均不具有“访问报告”职能)拥有哪些 App 的访问权限.如果您不更改他们的用户 App 访问权限,他们将默认拥有 ...

  10. ACM_蛋糕小王子铁头娃

    Problem Description: 铁头娃制作了很多蛋糕,想分给他的小伙伴们,他的小伙伴很喜欢铁头娃做的蛋糕,每个人都想分到最多蛋糕 铁头娃想到了一个头铁主意:先给小伙伴们从1到N编号,在1-N ...