[SCOI2009]粉刷匠 dp
原题链接
题解 :
这道题我感觉很新颖的地方是 这道题是二维的 , 所以要进行两次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相关推荐
- P4158 [SCOI2009]粉刷匠(dp)
P4158 [SCOI2009]粉刷匠(dp) 考虑每行独立计算. 所以可以开一个三维数组:g[i][j][k]g[i][j][k]g[i][j][k]第iii行前jjj列涂了kkk次的最大值. 然后 ...
- BZOJ 1296: [SCOI2009]粉刷匠( dp )
dp[ i ][ j ] = max( dp[ i - 1 ][ k ] + w[ i ][ j - k ] ) ( 0 <= k <= j ) 表示前 i 行用了 j 次粉刷的机会能正 ...
- [SCOI2009]粉刷匠 DP)
[SCOI2009]粉刷匠 题目描述: windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上 ...
- bzoj 1296: [SCOI2009]粉刷匠(DP+DP)
1296: [SCOI2009]粉刷匠 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2339 Solved: 1348 [Submit][Sta ...
- [SCOI2009]粉刷匠 牛客DP入门
0x00 题目来源 [SCOI2009]粉刷匠 0x10 Tag 线性DP.区间DP 0x20 题目描述 windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色'0' ...
- 【题解】P4158 [SCOI2009]粉刷匠(DP,背包)
[题解]P4158 [SCOI2009]粉刷匠 是一道资源规划 DP 的好题,但是我想了很久还去看了题解./kk我真菜. 题目链接 P4158 [SCOI2009]粉刷匠 - 洛谷 题意概述 发现自己 ...
- BZOJ1296:[SCOI2009]粉刷匠
1296: [SCOI2009]粉刷匠 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2038 Solved: 1182 [Submit][Sta ...
- [洛谷P4158][SCOI2009]粉刷匠(动态规划)
[洛谷P4158][SCOI2009]粉刷匠(动态规划) 题目描述 输入描述 输出描述 示例 输入 输出 题目思路 代码 欢迎关注微信公众号:Java后台开发 题目描述 windy有 N 条木板需要被 ...
- [洛谷]P4158 [SCOI2009]粉刷匠 (#线性dp+背包dp)
题目描述 windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个格子最多只能被 ...
最新文章
- MyEclipse8.x下安装freemarker ide插件
- csharp的几个特殊操作符
- IT技术人员必须思考的几个问题
- 数据特征分析-正太分布
- mybatis自动生成代码只有insert()和insertSelective()
- iPhone 12 Pro长这样:重回iPhone 5外观 心动了
- 【MySQL】MySQL中的查询语句的详解----等值连接、左连接、右连接、全连接
- Android开发笔记(一百四十三)任务调度JobScheduler
- 文件浏览器及数码相框 -2.3.2-freetype_arm-1
- 左右db_block_size了解和实验
- 行业分类代码 2017 最新版 创建sql语句
- c语言 字符串提取连续数字,c语言一串字符串中提取数字并相加的问题
- word 分栏后转html,word分栏后怎么到另一栏
- 局域网同步服务器系统时间,局域网中如何设置系统时间与服务器同步
- python输出课程表
- There is no 'root'@'%' registered解决
- vue3 provide 与 inject 用法
- 基于微信小程序开发的知乎答题王小游戏
- 防洪决策指挥系统(Axure高保真原型)
- android 蓝牙之数据传输
热门文章
- 【历史上的今天】4 月 30 日:信息论之父出生;万维网对所有人免费开放;图灵奖算法先驱诞生
- 光放接头形式 SC/APC; SC/PC
- 2022Q3手机配件增长榜:手机壳、数据线等供求不断增加
- Go实战--golang中使用gRPC和Protobuf实现高性能api(golang/protobuf、google.golang.org/grpc)
- 三观不合,永远不会是一路人!
- 运筹优化(六)--目标规划定义及解法
- 开发者专访|我从「人间地狱」的算法岗内卷中,倔强地踏出了一条路 前路漫漫,星芒万里
- Hadoop 大数据概念那些事儿
- 改进YOLOv7-Tiny系列:首发改进结合BiFPN结构的特征融合网络,网络融合更多有效特征,高效涨点
- 树莓派siri homekit_米家设备也能喊 Siri 控制,手把手教你把米家设备接入 Homekit