BZOJ 1296 粉刷匠(分组背包套DP)
刚开始往网络流的方向想。建不出图。。。
因为每次只能对一行进行染色。每一行都是独立的。
对于每一行,因为格子只能染一次,所以可以发现这是一个多阶段决策问题,这个决策就是当前格子染0还是染1.
令dp[i][j][k](k==0||k==1)表示当前行第i个格子用了j次染色,且这次染色染为k色 的最多有效格子。
这样我们用了O(n*m*m)得出了每一行用了v次染色获得的最多有效格子val。
显然的分组背包。每一个组最多选一种。再用O(V*n*m)求一遍分组背包即可。
总复杂度O((V+m)*m*n).
# include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> # include <vector> # include <queue> # include <stack> # include <map> # include <set> # include <cmath> # include <algorithm> using namespace std; # define lowbit(x) ((x)&(-x)) # define pi 3.1415926535 # define eps 1e-9 # define MOD 100000007 # define INF 1000000000 # define mem(a,b) memset(a,b,sizeof(a)) # define FOR(i,a,n) for(int i=a; i<=n; ++i) # define FO(i,a,n) for(int i=a; i<n; ++i) # define bug puts("H"); # define lch p<<1,l,mid # define rch p<<1|1,mid+1,r # define mp make_pair # define pb push_back typedef pair<int,int> PII; typedef vector<int> VI; # pragma comment(linker, "/STACK:1024000000,1024000000") typedef long long LL; int Scan() {int res=0, flag=0;char ch;if((ch=getchar())=='-') flag=1;else if(ch>='0'&&ch<='9') res=ch-'0';while((ch=getchar())>='0'&&ch<='9') res=res*10+(ch-'0');return flag?-res:res; } void Out(int a) {if(a<0) {putchar('-'); a=-a;}if(a>=10) Out(a/10);putchar(a%10+'0'); } const int N=2505; //Code begin...int val[55][55], dp[55][55][2], ans[2505]; char s[55][55];int main () {int n, m, T;scanf("%d%d%d",&n,&m,&T);FOR(i,1,n) scanf("%s",s[i]+1);FOR(i,1,n) {mem(dp,0);FOR(j,1,m) FOR(k,1,j) {dp[j][k][0]=max(dp[j-1][k][0],max(dp[j-1][k-1][0],dp[j-1][k-1][1]))+(s[i][j]=='0');dp[j][k][1]=max(dp[j-1][k][1],max(dp[j-1][k-1][0],dp[j-1][k-1][1]))+(s[i][j]=='1');}FOR(j,1,m) val[i][j]=max(dp[m][j][0],dp[m][j][1]);}FOR(i,1,n) for (int j=T; j>=0; --j) for (int k=min(j,m); k>=1; --k)ans[j]=max(ans[j],ans[j-k]+val[i][k]);printf("%d\n",ans[T]);return 0; }
View Code
转载于:https://www.cnblogs.com/lishiyao/p/6550684.html
BZOJ 1296 粉刷匠(分组背包套DP)相关推荐
- [SCOI2009]粉刷匠 牛客DP入门
0x00 题目来源 [SCOI2009]粉刷匠 0x10 Tag 线性DP.区间DP 0x20 题目描述 windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色'0' ...
- BZOJ 1296: [SCOI2009]粉刷匠( dp )
dp[ i ][ j ] = max( dp[ i - 1 ][ k ] + w[ i ][ j - k ] ) ( 0 <= k <= j ) 表示前 i 行用了 j 次粉刷的机会能正 ...
- bzoj 1296: [SCOI2009]粉刷匠(DP+DP)
1296: [SCOI2009]粉刷匠 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2339 Solved: 1348 [Submit][Sta ...
- [SCOI2009]粉刷匠 DP)
[SCOI2009]粉刷匠 题目描述: windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上 ...
- 小小粉刷匠 牛客(区间dp)
链接:https://ac.nowcoder.com/acm/problem/16129 来源:牛客网 题目描述 "lalala,我是一个快乐的粉刷匠",小名一边快活地唱着歌,一边 ...
- 小小粉刷匠(区间 dp)
小小粉刷匠 题目描述 "lalala,我是一个快乐的粉刷匠",小名一边快活地唱着歌,一边开心地刷着墙",兴致突然被打断,"小名,你今天如果刷不完这一栋楼的墙,那 ...
- P4158 [SCOI2009]粉刷匠(dp)
P4158 [SCOI2009]粉刷匠(dp) 考虑每行独立计算. 所以可以开一个三维数组:g[i][j][k]g[i][j][k]g[i][j][k]第iii行前jjj列涂了kkk次的最大值. 然后 ...
- 【题解】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 ...
最新文章
- 菜鸟教程 之 shell 脚本学习笔记 (一)
- 企业信息门户与办公自动化的集成应用
- 【分享】LazyLoad延迟加载(按需加载)
- python串口通讯数据过长_Python 串口通讯
- matlab入门4-mdlInitializeSizes解析
- python 选择文件对话框插件_[ PyQt入门教程 ] PyQt5基本控件使用:消息弹出、用户输入、文件/目录选择对话框...
- PostgreSQL的使用-02-在Linux下的基本配置
- python移动文件中某个内容_如何在Python中移动文件
- 从 JMM 透析 volatile 与 synchronized 原理
- 1 分钟抗住 10 亿请求!某些 App 是怎么做到的? | 原力计划
- java map传入参数_JAVA中map中参数的添加修改
- catch里面不想做任何处理_处理异常的三种健壮方式
- Linux系统下i350网卡固件更新说明
- 路由入口与vue布局入口
- dumple什么意思_dump是什么意思
- glib linux,[转载]linux下glib.h的介绍
- 2019CVPR单目深度估计综述
- 文件上传漏洞的小总结
- 双重检查锁与单例模式
- 利用电脑投放手机声音且可不冲突同时播放电脑声音的方法