BZOJ1296: [SCOI2009]粉刷匠 DP
Description
windy有 N 条木板需要被粉刷。 每条木板被分为 M 个格子。 每个格子要被刷成红色或蓝色。 windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色。 每个格子最多只能被粉刷一次。 如果windy只能粉刷 T 次,他最多能正确粉刷多少格子? 一个格子如果未被粉刷或者被粉刷错颜色,就算错误粉刷。
Input
输入文件paint.in第一行包含三个整数,N M T。 接下来有N行,每行一个长度为M的字符串,'0'表示红色,'1'表示蓝色。
Output
输出文件paint.out包含一个整数,最多能正确粉刷的格子数。
Sample Input
111111
000000
001100
Sample Output
HINT
30%的数据,满足 1 <= N,M <= 10 ; 0 <= T <= 100 。 100%的数据,满足 1 <= N,M <= 50 ; 0 <= T <= 2500 。
Solution
啊..感觉这个dp不难推啊。。就是推不出来
设$f[i][j]$表示前i条刷j次能刷对的格子数
$g[i][j][k]$表示第i行刷了j次前k个能刷的最大格子数
先把g算出来,然后用来转移$f[i][j]$
g的转移:
c数组为前缀和,c[i][j]表示第i行1~j的前缀和(这里用来处理两种颜色)
$$g[i][j][k]=max(g[i][j][k],g[i][j-1][l]+max(c[i][k]-c[i][l],k-l-c[i][k]+c[i][l]))$$
就是找个转移点然后涂蓝色还是涂红色取个max这样,效率$O(n^4)$
f的转移:
$$f[i][j]=max(f[i][j],f[i-1][j-k]+g[i][k][m])$$
有了g这个就很好推了
我就没有想到用个g来优化转移,死活想不出来
答案就扫一遍求个max就好
总复杂度是$O(n^4+n^2t)$
#include <bits/stdc++.h> using namespace std ; #define N 2510 int a[ ][ ] , c[ ][ ] ;
int n , m , t ;
int f[ ][ N ] ;
//前i条刷j次能刷对的格子数
int g[ ][ ][ ] ;
//第i行刷了j次前k个能刷的最大格子数 int main() {
scanf( "%d%d%d" , &n , &m , &t ) ;
for( int i = ; i <= n ; i ++ ) {
char ch[ ] ;
scanf( "%s" , ch+ ) ;
for( int j = ; j <= m ; j ++ ) {
c[ i ][ j ] = c[ i ][ j - ] + ( ch[ j ] ^ '' ) ;
}
}
for( int i = ; i <= n ; i ++ ) {
for( int j = ; j <= m ; j ++ ) {
for( int k = ; k <= m ; k ++ ) {
for( int l = j - ; l < k ; l ++ ) {
g[i][j][k]=max(g[i][j][k],g[i][j-][l]+max(c[i][k]-c[i][l],k-l-c[i][k]+c[i][l]));
}
}
}
}
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 ] ) ;
printf( "%d\n" , ans ) ;
return ;
}
BZOJ1296: [SCOI2009]粉刷匠 DP的更多相关文章
- [Bzoj1296][Scoi2009] 粉刷匠 [DP + 分组背包]
1296: [SCOI2009]粉刷匠 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2184 Solved: 1259[Submit][Statu ...
- 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 次粉刷的机会能正 ...
- Luogu P4158 [SCOI2009]粉刷匠(dp+背包)
P4158 [SCOI2009]粉刷匠 题意 题目描述 \(windy\)有\(N\)条木板需要被粉刷.每条木板被分为\(M\)个格子. 每个格子要被刷成红色或蓝色. \(windy\)每次粉刷,只能 ...
- 【Dp】Bzoj1296 [SCOI2009] 粉刷匠
Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个 ...
- 2018.09.02 bzoj1296: [SCOI2009]粉刷匠(dp套dp)
传送门 dp好题. 先推出对于每一行花费k次能最多粉刷的格子数. 然后再推前i行花费k次能最多粉刷的格子数. 代码: #include<bits/stdc++.h> #define N 5 ...
- BZOJ1296 [SCOI2009]粉刷匠 【dp】
题目 windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个格子最多只能被粉刷 ...
- BZOJ1296 [SCOI2009]粉刷匠 动态规划 分组背包
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1296 题意概括 有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝 ...
- bzoj1296: [SCOI2009]粉刷匠
dp. 用到俩次dp,用1和0代表俩种颜色,首先对于每块木板我们进行一次dp,g[i][j]代表前j个格子刷i次最多能涂到几个格子. 则 g[i][j]=max(g[i-1][k],max(cnt[j ...
随机推荐
- javaScript高级教程(五) Event Flow
1.两个阶段三个模型:Netscape支持事件捕获,IE支持事件冒泡,w3c是先捕获后冒泡 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 S ...
- 【HTML5】HTML5的自学路线
HTML5的开发市场已越来越火爆,他已经与我们的生活息息相关,它也成为了我们生活中的一部分,比如我们在网上购物,玩手游等等,都存在html5的影子,也正是因为html5的高度影响力,吸引了许多人开始关 ...
- 【Python】详解Python多线程Selenium跨浏览器测试
前言 在web测试中,不可避免的一个测试就是浏览器兼容性测试,在没有自动化测试前,我们总是苦逼的在一台或多台机器上安装N种浏览器,然后手工在不同的浏览器上验证主业务流程和关键功能模块功能,以检测不同浏 ...
- 【Swift初见】SourceKitService Terminated
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/weasleyqi/article/details/36162085 心血来潮想试试最新的Xcode6 ...
- 001-window版redis安装
一.参考地址 官方地址:https://redis.io/ windows版本[学习使用]:https://github.com/MicrosoftArchive/redis 二.windows版re ...
- [LeetCode] 58. Length of Last Word_Easy tag: String
Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the l ...
- iOS设计规范HIG
点击图标大小至少为这么大: Make it easy for people to interact with content and controls by giving each interacti ...
- Sublime Text3(mac)一些插件和快捷键
Sublime Text3(mac)一些插件和快捷键 楚简约 关注 2017.02.24 17:02* 字数 1216 阅读 412评论 0喜欢 2 下载地址http://www.sublimetex ...
- Object之wait
一.源码. 1.公共本地,且可继承但不可重写. 2.公共,且可继承但不可重写. 3.公共,且可继承但不可重写. 二.解释. 1.因为这些方法是Object类中的非静态的public方法,而任何其他类都 ...
- mysql的转储SQL文件
1.转储数据库的SQL文件,有两个选择,一是转储结构:另一种是转储数据与结构: 2.以上两种转储都不会将事件(定时器)转储,所以特别注意这个,否则以为将数据库备份完了,其实漏掉了所有的事件代码,所以需 ...