[SCOI2009]粉刷匠

news/2025/2/22 0:01:03/

点我写题  

题目描述

windy有 N 条木板需要被粉刷。 每条木板被分为 M 个格子。 每个格子要被刷成红色或蓝色。 windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色。 每个格子最多只能被粉刷一次。 如果windy只能粉刷 T 次,他最多能正确粉刷多少格子? 一个格子如果未被粉刷或者被粉刷错颜色,就算错误粉刷。

输入描述:

输入文件paint.in第一行包含三个整数,N M T。
接下来有N行,每行一个长度为M的字符串,'0'表示红色,'1'表示蓝色。

输出描述:

输出文件paint.out包含一个整数,最多能正确粉刷的格子数。

示例1

输入

3 6 3
111111
000000
001100

输出

16

思路

一开始我是觉得对每行的连续段做一次01背包,但是忽略了能错误粉刷的情况,于是很自然的想知道每行粉刷若干次的最优值,引出另一个问题,用ycl[i][j]表示当前行的前i个,刷j次的最优粉刷情况,转移就是考虑最后一次刷了多远即可,最后一次的贡献是该次粉刷包含的01元素个数取最大值。然后用分组背包的思路去更新我的答案dp即可。

代码

java">import java.util.*;
import java.io.*;
public class Main{public static void main(String[] args)throws Exception{BufferedReader rd=new BufferedReader(new InputStreamReader(System.in));BufferedWriter wd=new BufferedWriter(new OutputStreamWriter(System.out));String dr[]=rd.readLine().split(" ");int n=Integer.parseInt(dr[0]),m=Integer.parseInt(dr[1]),T=Integer.parseInt(dr[2]);int dp[]=new int [T+10];for(int i=0;i<T+10;i++) dp[i]=-(int)1e9;dp[0]=0;int sum0[]=new int [m+10];int sum1[]=new int [m+10];for(int i=1;i<=n;i++) {String s=" "+rd.readLine();sum0[0]=sum1[0]=0;for(int j=1;j<=m;j++) {sum0[j]=sum0[j-1];sum1[j]=sum1[j-1];if(s.charAt(j)=='1') sum1[j]++;else sum0[j]++;}int ycl[][]=new int [m+10][Math.min(m, T)+10];for(int j=1;j<=m;j++) {for(int k=1;k<=Math.min(T,j);k++) {for(int p=j-1;p>=0;p--) {int mx=Math.max(sum1[j]-sum1[p], sum0[j]-sum0[p]);ycl[j][k]=Math.max(ycl[j][k],ycl[p][k-1]+mx);}}}for(int j=T;j>=1;j--) {for(int p=Math.min(j, m);p>=1;p--) {dp[j]=Math.max(dp[j],dp[j-p]+ycl[m][p]);}}}wd.write(dp[T]+"\n");wd.flush();}}


http://www.ppmy.cn/news/1573706.html

相关文章

Redis 全方位解析:从入门到实战

引言 在当今互联网快速发展的时代&#xff0c;高并发、低延迟的应用场景越来越普遍。Redis&#xff0c;作为一款高性能的开源数据库&#xff0c;以其卓越的性能和灵活的功能&#xff0c;成为了许多开发者的首选工具。无论是在缓存、消息队列&#xff0c;还是在实时数据分析等领…

Github 2025-02-17 开源项目周报Top15

根据Github Trendings的统计,本周(2025-02-17统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目7TypeScript项目6Jupyter Notebook项目2JavaScript项目1文档项目1PHP项目1从零开始构建你喜爱的技术 创建周期:2156 天Star数量:25…

一文读懂Docker之Dockerfile基本使用

目录 一、基本指令 1、FROM指令 2、MAINTAINER指令 3、RUN指令 4、CMD指令 5、ENTRYPOINT指令 6、ENV指令 7、COPY指令 8、EXPOSE指令 9、LABEL指令 10、WORKDIR指令 二、Shell格式和Exec格式的区别 1、Shell格式 2、Exec格式 三、CMD指令详解 步骤一、定义一个…

android 定制mtp连接外设的设备名称

软件平台&#xff1a;Android11 硬件平台&#xff1a;QCS6125 需求&#xff1a;同一套代码基线支持多个产品型号&#xff0c;如S2N、S2C、E1等&#xff0c;但是编译的时候model属性字段在build目录就是配置好不可再更改的&#xff0c;如何动态的实现展示不同的mtp设备名称呢&a…

UART(一)——UART基础

一、定义 UART(Universal Asynchronous Receiver/Transmitter)是一种广泛使用的串行通信协议,用于在设备间通过异步方式传输数据。它无需共享时钟信号,而是依赖双方预先约定的参数(如波特率)完成通信。 功能和特点 基本的 UART 系统只需三个信号即可提供稳健的中速全双工…

数据结构 堆和priority_queue

一、堆的定义 堆&#xff08;heap&#xff09;&#xff0c;是⼀棵有着特殊性质的完全⼆叉树&#xff0c;可以⽤来实现优先级队列&#xff08;priorityqueue&#xff09;。 堆需要满⾜以下性质&#xff1a; 1. 是⼀棵完全⼆叉树&#xff1b; 2. 对于树中每个结点&#xff0c;如…

HarmonyOS NEXT网络状态监听HTTP和RCP请求网络

当我们在HarmonyOS NEXT中开发的应用&#xff0c;基本上都会使用网络请求&#xff0c;从服务端获取数据在客户端显示或者供用户交互&#xff0c;有时候网络发生变化时&#xff0c;我们需要做一些相应的操作&#xff0c;接下来我们一起来了解下在HarmonyOS NEXT下如何监听网络状…

Zookeeper和Kafka的依赖关系

Zookeeper 和 Kafka 是紧密相关的,它们在功能上相互协作,共同为分布式系统提供支持,以下是它们的关系具体介绍: Kafka 依赖 Zookeeper 进行元数据管理 主题信息存储:Kafka 中的主题(Topic)相关信息,如主题的名称、分区数量、副本分布等都存储在 Zookeeper 中。当 Kafk…