题解[SCOI2009]粉刷匠 难度:省选/NOI-
Description
每条木板被分为 M 个格子。
每个格子要被刷成红色或蓝色。
windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色。
每个格子最多只能被粉刷一次。
如果windy只能粉刷 T 次,他最多能正确粉刷多少格子?
一个格子如果未被粉刷或者被粉刷错颜色,就算错误粉刷。
Input
接下来有N行,每行一个长度为M的字符串,'0'表示红色,'1'表示蓝色。
Output
Sample Input
3 6 3
111111
000000
001100
Sample Output
16
Data Constraint
Hint
这道题很显然是一道动态规划题,但是我们发现,如果我们想用一个动态规划去做这道题,那么状态和转移都会十分的麻烦,这时候我们就要想是否需要两个动态规划来完成一个复杂的过程,我们看到这道题如果只问每一行的最优结果,那么转移就会很简单,所以我们可不可以将这个问题转化成先求每一行粉刷k次的最优解再求前i行操作k次的最优解。
既然思路确定,那么我们就可以设状态了:1-设置g数组表示在第i行,粉刷j次,刷到k的最优解,2-设置f表示前i行,刷j次的最优解。
转移方程也很好写:1- g[i][j][k]=max(g[i][j][k],max(用前缀和计算在p到k之间最多可以有多少正确的)+g[i][j-1][p]); p是从j-1开始枚举的,具体为什么代码上有注释,k是从j开始的,因为j进行了j次粉刷后最少粉刷到j点。
关于f的是 f[i][j]=max(f[i-1][j-k]+g[i][k][m]).
下面上代码:
#include<iostream>
#include<cstdio>
using namespace std;
int f[][],sum[][]; //f表示前i行刷j次最大对值。
int g[][][]; //第i行,刷到第j个用k次粉刷得到的最大对值。
int n,m,t;
char s[];
int main(){
ios::sync_with_stdio();
cin>>n>>m>>t;
for(int i=;i<=n;i++){
cin>>s;
sum[i][]=;
for(int j=;j<=m;j++){
if(s[j-]=='') sum[i][j]=sum[i][j-]+;
else sum[i][j]=sum[i][j-];
}
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
for(int k=j;k<=m;k++){
for(int p=j-;p<k;p++){ //因为q是第j-1次粉刷,每一次粉刷至少一格,所以q最少为j-1.
g[i][j][k]=max(g[i][j][k],max(sum[i][k]-sum[i][p],k-p-sum[i][k]+sum[i][p])+g[i][j-][p]);
}
}
}
}
for(int i=;i<=n;i++){
for(int j=;j<=t;j++){
for(int k=;k<=min(j,m);k++){
f[i][j]=max(f[i][j],f[i-][j-k]+g[i][k][m]);
}
}
}
int ans=;
for(int i=;i<=t;i++){
ans=max(ans,f[n][i]);
}
cout<<ans;
}
题解[SCOI2009]粉刷匠 难度:省选/NOI-的更多相关文章
- BZOJ 1296: [SCOI2009]粉刷匠 分组DP
1296: [SCOI2009]粉刷匠 Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上 ...
- 【BZOJ1296】[SCOI2009]粉刷匠(动态规划)
[BZOJ1296][SCOI2009]粉刷匠(动态规划) 题面 BZOJ 洛谷 题解 一眼题吧. 对于每个串做一次\(dp\),求出这个串刷若干次次能够达到的最大值,然后背包合并所有的结果即可. # ...
- 【BZOJ1296】[SCOI2009]粉刷匠 (DP+背包)
[SCOI2009]粉刷匠 题目描述 \(windy\)有 \(N\) 条木板需要被粉刷. 每条木板被分为 \(M\) 个格子. 每个格子要被刷成红色或蓝色. \(windy\)每次粉刷,只能选择一条 ...
- bzoj1296: [SCOI2009]粉刷匠(DP)
1296: [SCOI2009]粉刷匠 题目:传送门 题解: DP新姿势:dp套dp 我们先单独处理每个串,然后再放到全局更新: f[i][k]表示当前串枚举到第i个位置,用了k次机会 F[i][j] ...
- BZOJ 1296: [SCOI2009]粉刷匠( dp )
dp[ i ][ j ] = max( dp[ i - 1 ][ k ] + w[ i ][ j - k ] ) ( 0 <= k <= j ) 表示前 i 行用了 j 次粉刷的机会能正 ...
- 1296: [SCOI2009]粉刷匠[多重dp]
1296: [SCOI2009]粉刷匠 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1919 Solved: 1099[Submit][Statu ...
- 背包 DP【洛谷P4158】 [SCOI2009]粉刷匠
P4158 [SCOI2009]粉刷匠 windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上 ...
- BZOJ_1296_[SCOI2009]粉刷匠_DP
BZOJ_1296_[SCOI2009]粉刷匠_DP Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能 ...
- [Bzoj1296][Scoi2009] 粉刷匠 [DP + 分组背包]
1296: [SCOI2009]粉刷匠 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2184 Solved: 1259[Submit][Statu ...
随机推荐
- CSU-1110 RMQ with Shifts (单点更新+区间最小值 zkw线段树)
In the traditional RMQ (Range Minimum Query) problem, we have a static array A. Then for each query ...
- Centos7-firewall-cmd
firewall-cmd CentOS 7 默认使用的防火墙是firewalld,不是CentOS 6的iptables 查看防火墙状态 systemctl status firewalld 也可以 ...
- 前端写代码自动刷新神器Browsersync
Browsersync能让浏览器实时.快速响应您的文件更改(html.js.css.sass.less等)并自动刷新页面. 更重要的是 Browsersync可以同时在PC.平板.手机等设备下进项调试 ...
- CentOS7搭建Docker镜像实战
开发十年,就只剩下这套架构体系了! >>> 一.搭建环境 使用的是VMWare 12虚拟机安装的CentOS7 安装成功后修改ip: 1. ip addr查看相关信息: 2. 修 ...
- Hadoop MapReduce实现人员二度关系运算
1.一度人脉:双方直接是好友 2.二度人脉:双方有一个以上共同的好友,这时朋友网可以计算出你们有几个共同的好友并且呈现数字给你.你们的关系是: 你->朋友->陌生人 3.三度人脉:即你朋友 ...
- C#Stopwatch的简单计时 [收藏]
Stopwatch 类 命名空间:System.Diagnostics.Stopwatch 实例化:Stopwatch getTime=new Stopwatch(); 开始计时:getTime.St ...
- Tcp客户端构建流程
tcp客户端构建流程 tcp的客户端要比服务器端简单很多,如果说服务器端是需要自己买手机.查手机卡.设置铃声.等待别人打电话流程的话,那么客户端就只需要找一个电话亭,拿起电话拨打即可,流程要少很多 示 ...
- Maya2014下载安装与激活
目录 1. 更多推荐 2. 下载地址 2.1. OneDrive 2.2. 其他下载地址 3. 激活步骤 1. 更多推荐 其他Maya版本的下载与激活:https://www.cnblogs.com/ ...
- Linux性能优化从入门到实战:09 内存篇:Buffer和Cache
Buffer 是缓冲区,而 Cache 是缓存,两者都是数据在内存中的临时存储. 避免跟文中的"缓存"一词混淆,而文中的"缓存",则通指内存中的临时存储 ...
- 程序员要注意!现在是RSS复兴的时候了
一般来说,现代网络不乏恐怖,从无所不在的网络黑客到所有信息平台,再到各大平台的评论系统.不幸的是,我们建立的这个互联网并没有什么灵丹妙药.但任何人都厌倦了黑箱算法,控制你在网上看到的东西,一直存在但始 ...