[SCOI2009]粉刷匠(动态规划,序列dp,背包)
分别对每块木板做区间dp,设\(g[i][j]\)表示前i个格子,刷恰好j次,并且第i格是合法的最多合法的格子数.从前往后枚举断点来转移就好了.
这样处理再出来\(g[i][j]\)每一块木板i刷j次的最大合法格子数.
最后再合并每块木板的答案,用\(dp[i][j]\)表示前i块木板,一共恰好刷了k次的最大合法格子数,用刷表法暴力背包合并就好了.
很详细的注释.
#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 55
using namespace std;
int n,m,T,ans,sum[maxn],dp[maxn][maxn*maxn];
int f[maxn][maxn],g[maxn][maxn];
char s[maxn];
//分别对每块木板区间dp
//再用背包来合并
int main()
{
cin>>n>>m>>T;
for(int i=1;i<=n;i++)
{
scanf("%s",s+1);
memset(g,0x8f,sizeof(g));
g[0][0]=0;
for(int j=1;j<=m;j++)sum[j]=sum[j-1]+(s[j]=='1');//蓝色的前缀和
//g[j][k]当前木板表示前j个格子,刷k次的最多合法的格子数,并且j是合法的格子
for(int j=1;j<=m;j++)
for(int k=1;k<=j;k++)
for(int l=0;l<j;l++)
{
if(s[j]=='1')g[j][k]=max(g[j][k],g[l][k-1]+sum[j]-sum[l]);
else g[j][k]=max(g[j][k],g[l][k-1]+j-l-sum[j]+sum[l]);
}
//f[j][k]表示第i块木板,恰好刷k次的最多合法格子数
for(int j=0;j<=m;j++)
for(int k=0;k<=j;k++)
f[i][k]=max(f[i][k],g[j][k]);
}
//dp[i][j]表示前i个块木板,恰好刷j次的最多的合法格子数
for(int i=1;i<=n;i++)
for(int j=0;j<=T&&j<=i*m-m;j++)
for(int k=0;k<=m;k++)
dp[i][j+k]=max(dp[i][j+k],dp[i-1][j]+f[i][k]);
for(int i=0;i<=T;i++)ans=max(ans,dp[n][i]);
cout<<ans<<endl;
return 0;
}
[SCOI2009]粉刷匠(动态规划,序列dp,背包)的更多相关文章
- 【bzoj1296】【[SCOI2009]粉刷匠】多次背包dp及小小的优化
先放题面 Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜 ...
- BZOJ1296 [SCOI2009]粉刷匠 动态规划 分组背包
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1296 题意概括 有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝 ...
- bzoj 1296: [SCOI2009]粉刷匠 动态规划
Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个 ...
- 【BZOJ1296】[SCOI2009]粉刷匠 (DP+背包)
[SCOI2009]粉刷匠 题目描述 \(windy\)有 \(N\) 条木板需要被粉刷. 每条木板被分为 \(M\) 个格子. 每个格子要被刷成红色或蓝色. \(windy\)每次粉刷,只能选择一条 ...
- 背包 DP【洛谷P4158】 [SCOI2009]粉刷匠
P4158 [SCOI2009]粉刷匠 windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上 ...
- [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]粉刷匠(动态规划)
[BZOJ1296][SCOI2009]粉刷匠(动态规划) 题面 BZOJ 洛谷 题解 一眼题吧. 对于每个串做一次\(dp\),求出这个串刷若干次次能够达到的最大值,然后背包合并所有的结果即可. # ...
- BZOJ 1296: [SCOI2009]粉刷匠 分组DP
1296: [SCOI2009]粉刷匠 Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上 ...
随机推荐
- MyBatis从入门到精通:第一章测试代码
package tk.mybatis.simple.mapper; import org.apache.ibatis.io.Resources; import org.apache.ibatis.se ...
- Spring 注解编程之 AnnotationMetadata
在上篇文章 Spring 注解编程之模式注解 中我们讲到 Spring 模式注解底层原理,依靠 AnnotationMetadata 接口判断是否存在指定元注解. 这篇文章我们主要深入 Annotat ...
- 个人永久性免费-Excel催化剂功能第95波-地图数据挖宝之IP地址转地理地址及不同经纬度版本转换
经过上一波POI兴趣点查询后,地图数据挖宝也接近尾声,这次介绍在数据采集.准备过程中需要用到的一些转换功能,有IP地址转换地理地址及不同地图版本的经纬度转换. 背景知识 在电商.网络的数据分析过程中, ...
- [小米OJ] 10. 爬楼梯
dp 另: 小米oj上的测试样例是错的 ; ) function solution(line) { if (line == 0) return 0; if (line == 1) return 1; ...
- [剑指offer] 53. 表达数值的字符串
题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...
- python红蓝英雄大乱斗(面向对象实现)
红蓝英雄大乱斗 游戏规则 ''' 有红蓝两方英雄(可自定义个数) 随机一方英雄使用随机攻击方式攻击另一方英雄,任意一方英雄全部阵亡则游戏结束 每个英雄有 名字.生命值.普通攻击.Q技能攻击.W技能攻击 ...
- Envoy 源码分析--LDS
Envoy 源码分析--LDS LDS 是 Envoy 用来自动获取 listener 的 API. Envoy 通过 API 可以增加.修改或删除 listener. 先来总结下 listener ...
- Web网站工作原理解析
Web的工作原理 Web采用的是客户机--服务器架构(Client--Server model),如下图所示,其中客户端(Client)可以通过网络连接访问另一台计算机的资源或服务,而提供资源或服 ...
- 开发者福音!面向Web场景的云开发服务正式开放!
导 语 继支持小程序开发之后,云开发也支持Web使用啦!开发者们可以使用云开发提供的云端能力,直接开发网站应用,如PC端网页.公众号中的网页等.由此开发者可以在网站应用中借助云函数实现业务逻辑,通过与 ...
- 关于JLINK调试时出现的 erasing range....的问题结果方法
声明:本人当然不是提倡盗版. 昨天在使用JLINK的时候遇到了这个问题,但是非常蹊跷,首先可以下载,但不能进入调试,到后来完成不能下载了. 这个问题的原因就是你得Keil检测到你锁使用的JLINK不是 ...