原题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1296

粉刷匠

Description

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

Input

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

Output

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

Sample Input

3 6 3
111111
000000
001100

Sample Output

16

HINT

30%的数据,满足 1 <= N,M <= 10 ; 0 <= T <= 100 。 100%的数据,满足 1 <= N,M <= 50 ; 0 <= T <= 2500 。

题解

因为涂色是一行一行涂的,所以每行之间的涂色是互不干扰的,可以一行一行分别处理。

先用dye[i][j]dye[i][j]dye[i][j]表示前iii个格子涂j" role="presentation" style="position: relative;">jjj次能得到的最大收益,转移时只需要枚举中间点两种颜色分类讨论进行转移。

剩下的部分就类似于分组背包了,每一行都只能选择dye[n][j]dye[n][j]dye[n][j]中的一个,体积为jjj,价值为dye[n][j]" role="presentation" style="position: relative;">dye[n][j]dye[n][j]dye[n][j]中的值,简单的dpdpdp一下即可。

代码
#include<bits/stdc++.h>
using namespace std;
const int M=55;
int dye[M][M],dp[M][M*M],sum[M],n,m,t,ans;
char ch[M];
void in(){scanf("%d%d%d",&n,&m,&t);}
void ac()
{for(int i=1,j,k,l,mx;i<=n;++i){scanf("%s",ch+1);memset(dye,0,sizeof(dye));for(j=1;j<=m;++j)sum[j]=sum[j-1]+(ch[j]=='1');for(j=1;j<=m;++j)for(k=1;k<=m;++k)for(l=0;l<j;++l)dye[j][k]=max(dye[j][k],dye[l][k-1]+max(sum[j]-sum[l],j-l-sum[j]+sum[l]));for(j=1;j<=t;++j)for(k=1;k<=min(j,m);++k)dp[i][j]=max(dp[i][j],dp[i-1][j-k]+dye[m][k]);}for(int i=1;i<=t;++i)ans=max(ans,dp[n][i]);printf("%d",ans);
}
int main(){in();ac();}

BZOJ1296[SCOI2009] 粉刷匠相关推荐

  1. BZOJ1296:[SCOI2009]粉刷匠

    1296: [SCOI2009]粉刷匠 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2038  Solved: 1182 [Submit][Sta ...

  2. bzoj1296 [SCOI2009]粉刷匠

    题目链接:bzoj1296 题目大意: windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上 ...

  3. bzoj1296 [SCOI2009]粉刷匠 区间dp+背包

    每一条都是独立的,所以可以分开处理 对于一条,粉刷一定是粉刷完完整的一条是最优的(不会有比它优的),所以枚举次数起点转移 不同条之间就是分组背包的关系了.. 码: #include<iostre ...

  4. BZOJ1296(SCOI2009)[粉刷匠]--背包+DP

    [链接] bzoj1296 [解题报告] 很容易想到背包定义g[i][j]g[i][j]表示目前推了ii行,共刷了jj次. 然后我们再对每一行进行考虑. 定义f[i][j]f[i][j]表示目前推到第 ...

  5. [BZOJ1296][SCOI2009]粉刷匠

    原题地址 刷水- 数组开小了一次,呵呵- #include <cstdio> #include <algorithm> using namespace std; const i ...

  6. BZOJ 1296: [SCOI2009]粉刷匠( dp )

    dp[ i ][ j ] = max( dp[ i - 1 ][ k ] + w[ i ][ j - k ] )  ( 0 <= k <= j ) 表示前 i 行用了 j 次粉刷的机会能正 ...

  7. bzoj 1296: [SCOI2009]粉刷匠(DP+DP)

    1296: [SCOI2009]粉刷匠 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2339  Solved: 1348 [Submit][Sta ...

  8. [SCOI2009]粉刷匠 DP)

    [SCOI2009]粉刷匠 题目描述: windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上 ...

  9. [洛谷P4158][SCOI2009]粉刷匠(动态规划)

    [洛谷P4158][SCOI2009]粉刷匠(动态规划) 题目描述 输入描述 输出描述 示例 输入 输出 题目思路 代码 欢迎关注微信公众号:Java后台开发 题目描述 windy有 N 条木板需要被 ...

  10. [SCOI2009]粉刷匠 牛客DP入门

    0x00 题目来源 [SCOI2009]粉刷匠 0x10 Tag 线性DP.区间DP 0x20 题目描述 windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色'0' ...

最新文章

  1. Docker - 在CentOS7.5中升级Docker版本
  2. boost::hana::remove用法的测试程序
  3. FPGA实现OV5640摄像头及RGB图像数据采集
  4. 那朵美丽的格桑花,你是否依然绽放?
  5. mysql查询和缓存原理
  6. java 顺序输出_java输出顺序
  7. 小型金融知识图谱构流程示范
  8. Tomcat基础教程(三)
  9. 全链路跟踪对比,skywalking、zipkin等
  10. php tp框架教程,从零开始了解thinkphp框架,tp框架基础教程
  11. X509Certificate证书如何获取16位长度serial number?
  12. Word文档字间距怎么调?
  13. MMCM时钟动态调相
  14. winform程序内存不足或假死的问题
  15. kylin在hadoop 中的架构图_Kylin |1.麒麟架构及原理
  16. Webstorm2018激活和汉化
  17. VS2013未能正确加载microsoft.visualstudio.editor.implementation.editorpackage
  18. java 经纬度 电子围栏_电子围栏判断 java 版本
  19. 通过ssh连接aws(亚马逊 云服务器 实例)
  20. xlrd python读取excel 编码错误_python读取excel数据报xlrd.biffh.XLRDError错误原因

热门文章

  1. 机器学习数学基础之微分
  2. 利用Vailyn识别路径遍历和文件包含漏洞
  3. java点击菜单项弹出对话框_java怎么通过点击菜单弹出对话框
  4. win10计算机信息更改图,Win10系统怎么修改通知信息的位置【图文】
  5. html按钮的ui,button按钮 - 基础 - H-ui前端框架官方网站
  6. 雷林鹏分享:Redis 简介
  7. 336 Palindrome Pairs 回文对
  8. 【Cocos2d-html5】运动中速度效果
  9. Java 中extends与implements使用方法
  10. 在Android中使用自带API操作Json