题目

Description

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

Input

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

Output

输出一个整数,表示最多能正确粉刷的格子数。

Sample Input

3 6 3
111111
000000
001100

Sample Output

16

Data Constraint

Hint

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

分析

  • 设f[i][j][0/1]为前i个格子刷了j次,当前第i格的颜色为0/1
  • 显然
    r=((i-1)*m)+j;if (j!=1)f[r][k][0]=max(f[r-1][k][0],f[r-1][k-1][1]), f[r][k][1]=max(f[r-1][k][1],f[r-1][k-1][0]); else f[r][k][0]=max(f[r-1][k-1][0],f[r-1][k-1][1]), f[r][k][1]=max(f[r-1][k-1][1],f[r-1][k-1][0]); if (s[j-1]=='0') f[r][k][0]++; else f[r][k][1]++;

代码

 1 #include <iostream>
 2 using namespace std;
 3 int f[2501][2501][2],r;
 4 int main()
 5 {
 6     int n,m,t;
 7     cin>>n>>m>>t;
 8     string s;
 9     for (int i=1;i<=n;i++)
10     {
11         cin>>s;
12         for (int j=1;j<=m;j++)
13           for (int k=1;k<=t;k++)
14         {
15             r=((i-1)*m)+j;
16             if (j!=1)
17             f[r][k][0]=max(f[r-1][k][0],f[r-1][k-1][1]),
18             f[r][k][1]=max(f[r-1][k][1],f[r-1][k-1][0]);
19             else
20             f[r][k][0]=max(f[r-1][k-1][0],f[r-1][k-1][1]),
21             f[r][k][1]=max(f[r-1][k-1][1],f[r-1][k-1][0]);
22             if (s[j-1]=='0') f[r][k][0]++;
23             else f[r][k][1]++;
24
25         }
26     }
27     cout<<max(f[r][t][1],f[r][t][0]);
28 } 

转载于:https://www.cnblogs.com/zjzjzj/p/11330409.html

JZOJ 1035. 【SCOI2009】粉刷匠相关推荐

  1. BZOJ1296:[SCOI2009]粉刷匠

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

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

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

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

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

  4. [SCOI2009]粉刷匠 DP)

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

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

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

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

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

  7. P4158 [SCOI2009]粉刷匠(dp)

    P4158 [SCOI2009]粉刷匠(dp) 考虑每行独立计算. 所以可以开一个三维数组:g[i][j][k]g[i][j][k]g[i][j][k]第iii行前jjj列涂了kkk次的最大值. 然后 ...

  8. 【题解】P4158 [SCOI2009]粉刷匠(DP,背包)

    [题解]P4158 [SCOI2009]粉刷匠 是一道资源规划 DP 的好题,但是我想了很久还去看了题解./kk我真菜. 题目链接 P4158 [SCOI2009]粉刷匠 - 洛谷 题意概述 发现自己 ...

  9. 牛客网 【每日一题】[SCOI2009]粉刷匠

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

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

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

最新文章

  1. DCASE 2020权威声学比赛:腾讯多媒体实验室斩获双项指标国内第一
  2. buffer sort Oracle,[转]BUFFER SORT是BUFFER却不是SORT
  3. 04 列表的增删改查 常用方法 元祖 range
  4. TCP协议疑难杂症全景解析|硬核
  5. 最小二乘多项式拟合程序matlab,最小二乘法的多项式拟合(matlab实现)
  6. JS线程与事件循环解析
  7. Oracle中日期和时间字段的日常使用
  8. 【转载】linux进程控制-exec系列 exec系统调用
  9. CodeSmith 基础教程
  10. 使用Modular QoS CLI(MQC)基于FR的DLCI号对包进行分类
  11. 机遇与财富并存,一家网吧打造自己的客户数据库,后端疯狂盈利!
  12. java中的for循环里面创建对象和for循环外面创建对象之间的区别
  13. Mysql 死锁和死锁的解决方案
  14. unable to infer tagged configuration编译报错
  15. 攻击篇--远程控制(一)生成被控端与主控端
  16. API:BUMO Keypair 指导
  17. 遮挡人脸识别:基于Python3.8+Tensorflow2.2人脸遮挡情况的人脸识别
  18. Tomcat 8005/tcp端口安全配置
  19. ERROR! The server quit without updating PID file (/usr/local/mysql/data/
  20. GlidedSky爬虫-IP屏蔽1

热门文章

  1. 命令行管理windows服务器角色
  2. 第89天:HTML5中 访问历史、全屏和网页存储API
  3. idea编辑区光标问题
  4. 如何在树莓派上安装Fedora 25
  5. Android Theme 主题总结
  6. NC / Netcat - 文件传输
  7. SteinerTree模板
  8. 算法设计方法之 贪婪算法
  9. java geoprocessor_ArcGIS GeoEvent Processor for Server 安裝與配置 (僅適用於壓縮安裝包)...
  10. vs 编译器的堆空间不足_原创|面试官:Java对象一定分配在堆上吗?