zoukankan      html  css  js  c++  java
  • 洛谷P3392 涂国旗

    P3392 涂国旗

      • 107通过
      • 507提交
    • 题目提供者kkksc03
    • 标签
    • 难度普及-

      讨论  题解  

    最新讨论

    • 直接读字符会wa
    • WA?--
    • 为什么不对。。。
    • 跪求找错
    • 快点给钱
    • 这不就是荷兰国旗问题吗

    题目描述

    某国法律规定,只要一个由N*M个小方块组成的旗帜符合如下规则,就是合法的国旗。(毛熊:阿嚏——)

    • 从最上方若干行(>=1)的格子全部是白色的。

    • 接下来若干行(>=1)的格子全部是蓝色的

    • 剩下的行(>=1)全部是红色的

    现有一个棋盘状的破布,分成了N行M列的格子,每个格子是白色蓝色红色之一,小a希望把这个布改成该国国旗,方法是在一些格子上涂颜料,盖住之前的颜色。

    小a很懒,希望涂最少的格子,使这块破布成为一个合法的国旗。

    输入输出格式

    输入格式:

    第一行是两个整数,N,M

    接下来N行是一个矩阵,矩阵的每一个小方块是'W'(白),'B'(蓝),'R'(红)中的一个

    输出格式:

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

    输入输出样例

    输入样例#1:
    4 5
    WRWRW
    BWRWB
    WRWRW
    RWBWR
    输出样例#1:
    11

    说明

    样例解释:

    目标状态是

    WWWWW
    BBBBB
    RRRRR
    RRRRR

    一共需要改11个格子

    对于100%的数据,N,M<=50

    分析:以为是dp,但是仔细一想,发现完全可以枚举哪一行涂什么颜色,这样的话只需要在预处理的时候将第i行涂第j种颜色需要的代价求出来即可.

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    
    int n, m,w[55],r[55],b[55],ans = 2510;
    char c[55][55];
    
    int main()
    {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
            {
            cin >> c[i][j];
            if (c[i][j] == 'W')
            {
                r[i]++;
                b[i]++;
            }
            if (c[i][j] == 'R')
            {
                b[i]++;
                w[i]++;
            }
            if (c[i][j] == 'B')
            {
                w[i]++;
                r[i]++;
            }
            }
        //for (int i = 1; i <= n; i++)
            //printf("%d %d %d
    ", w[i], b[i], r[i]);
        
        for (int i = 2; i < n; i++)
            for (int j = i + 1; j <= n; j++)
            {
            int temp = 0;
            for (int k = 1; k <= n; k++)
            {
                if (k < i)
                {
                    temp += w[k];
                    //printf("1 %d
    ", temp);
                }
                if (k >= i && k < j)
                {
                    temp += b[k];
                    //printf("2 %d
    ", temp);
                }
                if (k >= j)
                {
                    temp += r[k];
                    //printf("3 %d
    ", temp);
                }
            }
            ans = min(temp, ans);
            //printf("%d
    ", temp);
            }
        printf("%d", ans);
        
        //while (1);
    
        return 0;
    }
  • 相关阅读:
    hsdis反汇编java源码工具的使用方法
    final添加内存屏障问题
    Spring-AOP
    Spring-IOC
    IO与NIO
    设计模式学习笔记
    Redis学习笔记
    MySQL优化
    STAR法则
    大文件分割之Linux
  • 原文地址:https://www.cnblogs.com/zbtrs/p/5998066.html
Copyright © 2011-2022 走看看