也是一道dp ,想到了就会觉得很巧妙

矩阵中只有白块和黑块,要求repaint后满足下述条件:

  1. 每列一种颜色
  2. 根据输入范围x, y 要求条纹宽度在[x, y] 之间

数据范围: nmx and y (1 ≤ n, m, x, y ≤ 1000; x ≤ y).

求:满足条件最少repaint的次数

自己在YY的时候觉得这么大的数据范围肯定没得暴力,估计就dp 了= =

是可以想出这么个dp 公式: cur[][] = Sigma(x ~ y) Min( former[][] + Sum[] )

不过细节没有想全

看了Tutorial 后顿时明白了

题中只有两种颜色Black 和 White ,先作一个预处理使得可以求出任意posX 到 posY 之间White 和 Black 块的数目

然后就可以开始状态转移了~

最后的答案就是min(dp[0][m], dp[1][m]).

Source Code:

//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <cstring>
#include <cmath>
#include <stack>
#include <string>
#include <map>
#include <set>
#include <list>
#include <queue>
#include <vector>
#include <algorithm>
#define Max(a,b) (((a) > (b)) ? (a) : (b))
#define Min(a,b) (((a) < (b)) ? (a) : (b))
#define Abs(x) (((x) > 0) ? (x) : (-(x)))
#define MOD 1000000007
#define pi acos(-1.0) using namespace std; typedef long long ll ;
typedef unsigned long long ull ;
typedef unsigned int uint ;
typedef unsigned char uchar ; template<class T> inline void checkmin(T &a,T b){if(a>b) a=b;}
template<class T> inline void checkmax(T &a,T b){if(a<b) a=b;} const double eps = 1e- ;
const int N = ;
const int M = ;
const ll P = 10000000097ll ;
const int INF = 0x3f3f3f3f ; char a[][];
int v1[][], v2[][];
int dp[][]; int main(){
int i, j, k, t, n, m, numCase = ;
int x, y;
while(cin >> n >> m >> x >> y){
memset(v1, , sizeof(v1));
for(i = ; i <= n; ++i){
for(j = ; j <= m; ++j){
cin >> a[i][j];
if('#' == a[i][j]) ++v1[j][];
else ++v1[j][];
}
}
v2[][] = v1[][];
v2[][] = v1[][];
for(i = ; i <= m; ++i){
v2[i][] = v2[i - ][] + v1[i][];
v2[i][] = v2[i - ][] + v1[i][];
}
memset(dp, 0x3f, sizeof(dp));
dp[][] = dp[][] = ;
for(j = ; j <= m; ++j){
for(int a = x; a <= y; ++a){
if(j - a < ) break;
checkmin(dp[][j], dp[][j - a] + v2[j][] - v2[j - a][]);
checkmin(dp[][j], dp[][j - a] + v2[j][] - v2[j - a][]);
}
}
cout << Min(dp[][m], dp[][m]) << endl; } return ;
}

CodeForces 225C Barcode DP的更多相关文章

  1. Codeforces 225C Barcode(矩阵上DP)

    题目链接:http://codeforces.com/contest/225/problem/C 题目大意: 给出一个矩阵,只有两种字符'.'和'#',问最少修改多少个点才能让每一列的字符一致,且字符 ...

  2. CF思维联系–CodeForces - 225C. Barcode(二路动态规划)

    ACM思维题训练集合 Desciption You've got an n × m pixel picture. Each pixel can be white or black. Your task ...

  3. CF 225C Barcode(DP)

    传送门:点我 You've got an n × m pixel picture. Each pixel can be white or black. Your task is to change t ...

  4. 【Codeforces 225C】Barcode

    [链接] 我是链接,点我呀:) [题意] 让你把每一列都染成一样的颜色 要求连续相同颜色的列的长度都大于等于x小于等于y 问你最少的染色次数 [题解] 先求出每一列染成#或者.需要染色多少次 设f[0 ...

  5. codeforces 682D(DP)

    题目链接:http://codeforces.com/contest/682/problem/D 思路:dp[i][j][l][0]表示a串前i和b串前j利用a[i] == b[j]所得到的最长子序列 ...

  6. codeforces 666A (DP)

    题目链接:http://codeforces.com/problemset/problem/666/A 思路:dp[i][0]表示第a[i-1]~a[i]组成的字符串是否可行,dp[i][1]表示第a ...

  7. Codeforces 176B (线性DP+字符串)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...

  8. Codeforces 55D (数位DP+离散化+数论)

    题目链接: http://poj.org/problem?id=2117 题目大意:统计一个范围内数的个数,要求该数能被各位上的数整除.范围2^64. 解题思路: 一开始SB地开了10维数组记录情况. ...

  9. Codeforces 264B 数论+DP

    题目链接:http://codeforces.com/problemset/problem/264/B 代码: #include<cstdio> #include<iostream& ...

随机推荐

  1. python的reduce()函数

    reduce()函数也是Python内置的一个高阶函数. reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接 ...

  2. python之math模块

    1.math简介 >>>import math #导入math模块 >>>dir(math) #这句可查看所有函数名列表 >>>help(math ...

  3. javascript 定义类(转载)

    Javascript本身并不支持面向对象,它没有访问控制符,它没有定义类的关键字class,它没有支持继承的extend或冒号,它也没有用来支持虚函数的virtual,不过,Javascript是一门 ...

  4. linux使用技巧(shell/vi/screen)

    1,Shell bash > awk '{print {NF}}' file 此时想修改操作命令可参照下面快捷方式 ctrl a 光标移动到命令最前面 ctrl e 光标移动到命令最后面 ctr ...

  5. A/B(扩展欧几里德)

    A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  6. 08.net网站开发(前端):5.jQuery

    开发网站肯定要会JS,嫌代码太难看难学那至少要学会jQuery.当然我见过有些项目纯用服务端控件也是能做出来的,但我相信,那些碰到复杂的需求的话肯定很棘手的.jQuery是对JS和DOM的封装,少量代 ...

  7. URAL 1303

    题目大意:给出N个区间[Li,Ri](1<=i<=N),一个正整数M,求N个区间里,并区间包含[0,M]的区间的最小个数(无解时输出:No solution). KB     64bit ...

  8. Redis初始化配置及增删改查

    package com.calc.tools import redis.clients.jedis.JedisPool import redis.clients.jedis.Jedis import ...

  9. [Jobdu] 题目1516 : 调整数组顺序使奇数位于偶数前面

    void diffOddAndEven(int a[], int n) { , high = n - ; int pivot; while (low < high) { == && ...

  10. BZOJ 1194: [HNOI2006]潘多拉的盒子( BFS + tarjan + dp )

    O(S²)枚举2个诅咒机, 然后O(n²)BFS去判断. 构成一个有向图, tarjan缩点, 然后就是求DAG的最长路.. ------------------------------------- ...