【BZOJ1296】[SCOI2009]粉刷匠 (DP+背包)
[SCOI2009]粉刷匠
题目描述
\(windy\)有 \(N\) 条木板需要被粉刷。 每条木板被分为 \(M\) 个格子。 每个格子要被刷成红色或蓝色。
\(windy\)每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色。 每个格子最多只能被粉刷一次。
如果\(windy\)只能粉刷 \(T\) 次,他最多能正确粉刷多少格子?
一个格子如果未被粉刷或者被粉刷错颜色,就算错误粉刷。
输入输出格式
输入格式:
第一行包含三个整数,\(N ,M, T\)。
接下来有N行,每行一个长度为\(M\)的字符串,'\(0\)'表示红色,'\(1\)'表示蓝色。
输出格式:
包含一个整数,最多能正确粉刷的格子数。
输入输出样例
输入样例#1:
3 6 3
111111
000000
001100
输出样例#1:
16
说明
\(30\%\)的数据,满足 \(1 <= N,M <= 10 ; 0 <= T <= 100\) 。
\(100\%\)的数据,满足 \(1 <= N,M <= 50 ; 0 <= T <= 2500\) 。
题解
\(dp[i][j][k]\)表示第\(i\)块板已经刷完了前\(j\)块用了\(k\)次的最大价值;
我们会发现每个\(i\)都是独立的,所以转移时不去看\(i\),把转移想成每个独立的子问题。
\(dp[i][j][k]\)的转移:
我们可以枚举一个断点\(h\),使用一次粉刷机会从\(h+1\)到\(j\),价值为\(h+1\)到\(j\)的\(max(red+bule)\)。
\(dp[i][j][k]=max(dp[i][j][k],dp[i][h][k-1]+mx[i][h+1][j])\);
\(mx[i][l][r]\)为提前预处理第\(i\)块板\(l\)到\(r\)的 \(max(red+bule)\)。
最后直接跑分组背包统计答案。
code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#define N 55
#define R register
#define ll long long
using namespace std;
template<typename T>inline void read(R T &a){
R char c=getchar();R T x=0,f=1;
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
a=f*x;
}
int n,m,t,ans;
int dp[N][N][N],sum[2][N],mx[N][N][N],f[2505];
char s[N];
int main(){
read(n);read(m);read(t);
for(R int i=1;i<=n;i++){
scanf("%s",s+1);
sum[0][0]=sum[1][0]=0;
for(R int j=1;j<=m;j++){
sum[0][j]=sum[0][j-1]+(s[j]=='0');
sum[1][j]=sum[1][j-1]+(s[j]=='1');
}
for(R int j=1;j<=m;j++){
mx[i][j][j]=1;
for(R int k=j+1;k<=m;k++)
mx[i][j][k]=max(sum[0][k]-sum[0][j-1],sum[1][k]-sum[1][j-1]);
}
}
for(R int i=1;i<=n;i++)
for(R int j=1;j<=m;j++)
for(R int k=1;k<=m;k++)
for(R int h=0;h<j;h++)
dp[i][j][k]=max(dp[i][j][k],dp[i][h][k-1]+mx[i][h+1][j]);
for(R int i=1;i<=n;i++)
for(R int j=t;j>=0;j--)
for(R int k=0;k<=m;k++)
if(j-k>=0)f[j]=max(f[j],f[j-k]+dp[i][m][k]),ans=max(ans,f[j]);
printf("%d\n",ans);
return 0;
}
【BZOJ1296】[SCOI2009]粉刷匠 (DP+背包)的更多相关文章
- [Bzoj1296][Scoi2009] 粉刷匠 [DP + 分组背包]
1296: [SCOI2009]粉刷匠 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2184 Solved: 1259[Submit][Statu ...
- Luogu P4158 [SCOI2009]粉刷匠(dp+背包)
P4158 [SCOI2009]粉刷匠 题意 题目描述 \(windy\)有\(N\)条木板需要被粉刷.每条木板被分为\(M\)个格子. 每个格子要被刷成红色或蓝色. \(windy\)每次粉刷,只能 ...
- BZOJ1296: [SCOI2009]粉刷匠 DP
Description 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 次粉刷的机会能正 ...
- BZOJ1296 [SCOI2009]粉刷匠 动态规划 分组背包
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1296 题意概括 有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝 ...
- 【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]粉刷匠——背包
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1296 对于不同木板之间,最终统计答案时做一个分组背包即可: 而要进行分组背包,就需要知道每个 ...
随机推荐
- python 字符编码处理问题总结
Python中常常遇到这种字符编码问题,尤其在处理网页源代码时(特别是爬虫中): UnicodeDecodeError: ‘XXX' codec can't decode bytes in posit ...
- Android 重写EditText回车事件
之前遇到的问题没来得及记录下来,趁今晚有空就重新回忆并写下了. 我们在用到EditText这个空间时经常需要重写软键盘中的回车事件以配合我们接下来的响应,比如点击回车变成搜索.发送.完成等. Edit ...
- 在OpenSSL中添加自定义加密算法
一.简介 本文以添加自定义算法EVP_ssf33为例,介绍在OpenSSL中添加自定义加密算法的方法 二.步骤 1.修改crypto/object/objects.txt,注册算法OID,如下: rs ...
- 洛谷 P2899 [USACO08JAN]手机网络Cell Phone Network
题目描述 Farmer John has decided to give each of his cows a cell phone in hopes to encourage their socia ...
- 无归档情况下使用BBED处理ORA-01113错误
在丢失归档情况下,恢复时常会遇到ora-01113错误,以下实验模拟表空间offline,然后在丢失归档文件的情况下使用BBED修改文件头信息,最后恢复数据文件: 数据库版本: SQL> sel ...
- 1146 ID Codes
题目链接: http://poj.org/problem?id=1146 题意: 给定一个字符串(长度不超过50), 求这个字符串的下一个字典序的字符串, 如果已经是最大字典序, 那么输出 " ...
- jQuary总结2: jQuery选择器
1 什么是jQuery选择器 获取页面元素,并且把页面元素包装成jQuery对象的方式 2 为什么要学习jQuery选择器 为了更加方便的获取页面上的元素,并且将元素包装起来,使我们编写程序时更加便 ...
- 使用Word2016发布CSDN博客
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...
- linux 扩展权限
默认权限 每一个终端都拥有一个umask属性,来确定新建文件,文件夹的默认权限 umask使用数字权限方式表示,如:022 新建目录的默认权限是:777-umask; 新建文件的默认权限是:6 ...
- .net EventHandler 事件处理
通常定义事件 都是通过自定义委托的方式来实现, 今天使用EventHandler 委托来定义事件: public class NewMailEventArgs : EventArgs { priv ...