涂国旗

【题目描述】

某国法律规定,一个由N*M(N,M <= 50)个小方块组成的合法旗帜应符合以下规则:

(1)从最上方开始,连续若干行( >= 1)的格子全部是白色的;

(2)接下来连续的若干行( >= 1)的格子全部是蓝色的;

(3)剩下的若干行( >= 1)的格子全部是红色的。

现有一块棋盘状的布料,分成了N*M的格子,每个格子是白色、蓝色、红色三种颜色的其中之一,在这块布料的一些格子上涂抹颜料,盖住之前的颜色,从而改成合法旗帜,询问至少涂多少格子。

【输入描述】

第一行输入两个整数N、M;

接下来N行输入一个矩阵,矩阵的每一格为‘W‘(白)、‘B‘(蓝)、‘R‘(红)中的一个。

【输出描述】

输出一个整数,表示至少需要涂多少块。

【输入样例】

4 5

WRWRW

BWRWB

WRWRW

RWBWR

【输出样例】

11

【数据范围及提示】

样例的目标状态是:

WWWWW

BBBBB

RRRRR

RRRRR

至少需要改11个格子。

源代码:

#include<iostream>
#define INF 1000000000
using namespace std;
int m,n,ans=INF,i[50][3]={0},Sum[50][3]={0};
int main()
{
    cin>>n>>m;
    for (int a=1;a<=n;a++) //读入很恶心,豁出去了。
    {
          for (int b=1;b<=m;b++)
          {
              char t;
              cin>>t;
              if (t==‘W‘)
              {
                    i[a][1]++;
                    i[a][2]++;
              }
              if (t==‘B‘)
              {
                  i[a][0]++;
                  i[a][2]++;
              }
              if (t==‘R‘)
              {
                    i[a][0]++;
                    i[a][1]++;
              }
        }
        Sum[a][0]+=Sum[a-1][0]+i[a][0]; //还是不冷静。
        Sum[a][1]+=Sum[a-1][1]+i[a][1];
        Sum[a][2]+=Sum[a-1][2]+i[a][2];
    }
    for (int a=2;a<n-1;a++)
      for (int b=a+1;b<n;b++)
        ans=min(ans,Sum[a-1][0]+Sum[b-1][1]-Sum[a-1][1]+Sum[n][2]-Sum[b-1][2]);
    cout<<ans;
    return 0;
}

/*
    解题思路:
        看到题目中那小小的数据范围,不禁颓于暴力的毒瘾之中。
        可以对暴力O(n^4)进行优化,利用前缀和来求区间修改数,便可以将O(n^2)转化为O(1)。
*/
时间: 2024-07-31 10:07:55

涂国旗的相关文章

洛谷 P3392 涂国旗

P3392 涂国旗 题目描述 某国法律规定,只要一个由N*M个小方块组成的旗帜符合如下规则,就是合法的国旗.(毛熊:阿嚏——) 从最上方若干行(>=1)的格子全部是白色的. 接下来若干行(>=1)的格子全部是蓝色的 剩下的行(>=1)全部是红色的 现有一个棋盘状的破布,分成了N行M列的格子,每个格子是白色蓝色红色之一,小a希望把这个布改成该国国旗,方法是在一些格子上涂颜料,盖住之前的颜色. 小a很懒,希望涂最少的格子,使这块破布成为一个合法的国旗. 输入输出格式 输入格式: 第一行是两个

洛谷⑨月月赛Round2 P3392涂国旗[DP]

题目描述 某国法律规定,只要一个由N*M个小方块组成的旗帜符合如下规则,就是合法的国旗.(毛熊:阿嚏——) 从最上方若干行(>=1)的格子全部是白色的. 接下来若干行(>=1)的格子全部是蓝色的 剩下的行(>=1)全部是红色的 现有一个棋盘状的破布,分成了N行M列的格子,每个格子是白色蓝色红色之一,小a希望把这个布改成该国国旗,方法是在一些格子上涂颜料,盖住之前的颜色. 小a很懒,希望涂最少的格子,使这块破布成为一个合法的国旗. 输入输出格式 输入格式: 第一行是两个整数,N,M 接下来

洛谷P3392 涂国旗

题目描述 某国法律规定,只要一个由N*M个小方块组成的旗帜符合如下规则,就是合法的国旗.(毛熊:阿嚏——) 从最上方若干行(>=1)的格子全部是白色的. 接下来若干行(>=1)的格子全部是蓝色的 剩下的行(>=1)全部是红色的 现有一个棋盘状的破布,分成了N行M列的格子,每个格子是白色蓝色红色之一,小a希望把这个布改成该国国旗,方法是在一些格子上涂颜料,盖住之前的颜色. 小a很懒,希望涂最少的格子,使这块破布成为一个合法的国旗. 输入输出格式 输入格式: 第一行是两个整数,N,M 接下来

洛谷⑨月月赛Round2 官方比赛 OI

自评: (完成时间3.5时) 第一题 模拟 虽然A了,代码敲得有点慢 第二题 最短路 第一次敲对了,又考虑数据范围和答案范围,改错了,100分改成42分.QAQ. 第三题 乱搞 80分 还可以(因为没思路啊),不过也有A了的 如果第二题不手贱的话,day1 280分,day2再随便写点,妥妥的一等. 可惜没如果.(也还好不是联赛). P3392 涂国旗 10通过 267提交 题目提供者kkksc03 标签 难度普及- 提交 讨论 题解 最新讨论 快点给钱 这不就是荷兰国旗问题吗 重复题目 题目描

台军机绘击落日机标志纪念抗战 遭日抗议后涂销

为纪念对日抗战胜利七十周年,台防务部门于新竹空军基地举行"空军纪念图腾彩绘战机"媒体参访活动.在F-16战机机身展示彩绘,复刻二战时期"飞虎队"鲨鱼头涂装,机身上可见"太公令(二战期间中国战区最著名的两架战机之一)"字样与5面日本国旗,象征击落的5架日机.http://www.ximalaya.com/zhubo/29640778/ http://www.ximalaya.com/zhubo/29640790/ http://www.ximala

荷兰国旗问题

荷兰国旗问题: 现有红,白,蓝三个不同颜色的小球,乱序排列在一起,重新排列这些小球,使得红白蓝三色的同颜色的球在一起. 问题分析: 问题转换为:给定数组A[0,1,...,N-1],元素只能取0,1,2三个值,设计算法使得数组重新排列成“000...111..222”的形式. 可以使用三个游标,begin=0,cur=0,end=N-1. 程序实现: 1 /*************************************** 2 FileName HollandFlag.cpp 3 A

2016 - 1 - 3 国旗选择demo

// // ViewController.m // 国旗 // // Created by Mac on 16/1/3. // Copyright © 2016年 Mac. All rights reserved. // #import "ViewController.h" #import "FlagView.h" #import "CZFlag.h" @interface ViewController ()<UIPickerViewDat

BZOJ 1260 [CQOI2007]涂色paint(区间DP)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1260 [题目大意] 假设你有一条长度为n的木版,初始时没有涂过任何颜色 每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色 求最少的涂色次数达到目标状态 [题解] dp[i][j]表示涂抹i到j的最优答案, 显然当i和j相同时,可以从i+1……j,i……j-1,i+1……j-1转移过来, 同时也可以从两个区间组合得到. [代码] #include <cstdio>

1162 填涂颜色

难度:普及- 题目类型:BFS 提交次数:5 涉及知识:BFS 题目描述 由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=6),涂色前和涂色后的方阵如下: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 0 0 1 0 1 1 2 2 1 1 1 0 0 0 1 1 1 2 2 2 1 1 0 0 0 0 1 1 2 2 2 2 1