原题链接

题解 :

这道题我感觉很新颖的地方是 这道题是二维的 , 所以要进行两次dp处理 ,
令 f[i][j][k] 表示第 i个木板粉刷 j 次涂了前面 k 个格子的正确格子数
因为只有两种颜色, 对于某一块木板, 我们可以维护一个前缀和 sum[i][j]表示第 i个木板的第 j个格子前蓝色格子的数目
对于单个木板有 f[i][j][k] = max(f[i][j][k], f[i][j - 1][l] + max(sum[i][k] - sum[i][l], k - l - sum[i][k] + sum[i][l])
表示对第 i 块木板涂了 j次, 此时到第 k 个位置可以从第 i 块木板的涂了 j - 1 次的第 l 个位置转移过来
对于要么取蓝色, 要么取红色, 我们取个 max 即可, sum[i][k] - sum[i][l] 是 [l, k]的蓝色格子 k - l - sum[i][k] + sum[i][l]是 [l, k]的红色格子 此时再考虑多个木板情况
显然有 dp[i][j] = max(dp[i][j], dp[i - 1][j - k] + f[i][k][m])表示到第 i 个木板涂了 j 次可以从 第i - 1个木板涂了 j - k 次转移过来

代码 :

#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
ll dp[55][2510] ;       // 前 i 个木板粉刷 j 次的正确格子数
ll f[55][2510][55] ;    // 第 i 个木板粉刷 j 次涂了前面 k 个格子的正确格子数
ll sum[55][55] ;        // 第 i 个木板的第 j 个格子前蓝色格子的数目int main(){int n , m , t ;cin >> n >> m >> t ;string s ;for(int i = 1 ; i <= n ; i++){           //先预处理前缀和统计每一块木板前j格蓝色的数量 cin >> s ;s = ' ' + s ;sum[i][0] = 0 ;for(int j = 1 ; j <= m ; j++){sum[i][j] = sum[i][j-1] + (s[j] == '1') ; }}for(int i = 1 ; i <= n ; i++){          //先单独对每一块木板做dp处理 for(int j = 1 ; j <= m ; j++){for(int k = 1 ; k <= m ; k++){for(int l = j - 1 ; l < k ; l++)f[i][j][k] = max(f[i][j][k] , f[i][j-1][l] + max(sum[i][k] - sum[i][l] , k - l - sum[i][k] + sum[i][l])) ;}}}ll ans = 0 ;for(int i = 1 ; i <= n ; i++){         //再对木板做一次dp处理 for(int j = 1 ; j <= t ; j++){for(int k = 0 ; k <= min(j , m) ; k++){dp[i][j] = max(dp[i][j] , dp[i-1][j-k] + f[i][k][m]) ;ans = max(ans , dp[i][j]) ;}}}cout << ans << endl ;return 0 ;
}

[SCOI2009]粉刷匠 dp相关推荐

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

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

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

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

  3. [SCOI2009]粉刷匠 DP)

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

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

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

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

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

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

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

  7. BZOJ1296:[SCOI2009]粉刷匠

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

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

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

  9. [洛谷]P4158 [SCOI2009]粉刷匠 (#线性dp+背包dp)

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

最新文章

  1. MyEclipse8.x下安装freemarker ide插件
  2. csharp的几个特殊操作符
  3. IT技术人员必须思考的几个问题
  4. 数据特征分析-正太分布
  5. mybatis自动生成代码只有insert()和insertSelective()
  6. iPhone 12 Pro长这样:重回iPhone 5外观 心动了
  7. 【MySQL】MySQL中的查询语句的详解----等值连接、左连接、右连接、全连接
  8. Android开发笔记(一百四十三)任务调度JobScheduler
  9. 文件浏览器及数码相框 -2.3.2-freetype_arm-1
  10. 左右db_block_size了解和实验
  11. 行业分类代码 2017 最新版 创建sql语句
  12. c语言 字符串提取连续数字,c语言一串字符串中提取数字并相加的问题
  13. word 分栏后转html,word分栏后怎么到另一栏
  14. 局域网同步服务器系统时间,局域网中如何设置系统时间与服务器同步
  15. python输出课程表
  16. There is no 'root'@'%' registered解决
  17. vue3 provide 与 inject 用法
  18. 基于微信小程序开发的知乎答题王小游戏
  19. 防洪决策指挥系统(Axure高保真原型)
  20. android 蓝牙之数据传输

热门文章

  1. 【历史上的今天】4 月 30 日:信息论之父出生;万维网对所有人免费开放;图灵奖算法先驱诞生
  2. 光放接头形式 SC/APC; SC/PC
  3. 2022Q3手机配件增长榜:手机壳、数据线等供求不断增加
  4. Go实战--golang中使用gRPC和Protobuf实现高性能api(golang/protobuf、google.golang.org/grpc)
  5. 三观不合,永远不会是一路人!
  6. 运筹优化(六)--目标规划定义及解法
  7. 开发者专访|我从「人间地狱」的算法岗内卷中,倔强地踏出了一条路 前路漫漫,星芒万里
  8. Hadoop 大数据概念那些事儿
  9. 改进YOLOv7-Tiny系列:首发改进结合BiFPN结构的特征融合网络,网络融合更多有效特征,高效涨点
  10. 树莓派siri homekit_米家设备也能喊 Siri 控制,手把手教你把米家设备接入 Homekit