code1744 方格染色
稍微复杂一点的划分dp
设f[i][j][k]为第i行前j个k次粉刷正确的最大值
由于每行循环使用,可以去掉第一维,但每次不要忘了清零(卡了好久)
f[j][k]=max{ f[u][j-1] + max(u+1到j的蓝色的个数,u+1到j的红颜色的个数) }
设h[i][k]为第i行分成k份的最大值
h[i][k]=f[i][m][k]
设dp[i][k]为前i行总共分成k份的最大值
dp[i][k]=dp[i-1][t-x]+h[i][x]
x表示在第i行使用x次
代码如下:
#include<iostream>
#define Size 55
#define Max_t 3000
using namespace std; char a[Size][Size];
int f[Size][Size];
int h[Size][Size];
int dp[Size][Max_t];
int s1[Size][Size],s2[Size][Size];
int n,m,t; inline int sum1(int i,int l,int r){return s1[i][r]-s1[i][l-];}
inline int sum2(int i,int l,int r){return s2[i][r]-s2[i][l-];} int main(){
freopen("1744.in","r",stdin); cin>>n>>m>>t;
for(int i=;i<=n;i++){
cin>>a[i]+;
for(int j=;j<=m;j++){
s1[i][j]=s1[i][j-];
s2[i][j]=s2[i][j-];
if(a[i][j]=='')s1[i][j]++;
else s2[i][j]++;
}
} //test
/*
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<s1[i][j]<<' ';
}
cout<<endl;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<s2[i][j]<<' ';
}
cout<<endl;
}
*/ for(int i=;i<=n;i++){//行
for(int j=;j<=m;j++){//前j个数
for(int k=;k<=min(t,j);k++){//分成k份
f[j][k]=;//注意f是每行重复使用的,需要清零!
for(int u=k-;u<=j-;u++){//分割点
f[j][k]=max(f[j][k], f[u][k-]+max(sum1(i,u+,j),sum2(i,u+,j)));
}
//cout<<i<<','<<j<<','<<k<<':'<<f[j][k]<<endl;
}
}
//cout<<"----------"<<endl;
for(int k=;k<=min(m,t);k++){
h[i][k]=f[m][k];
//cout<<i<<','<<k<<':'<<h[i][k]<<endl;
}
//cout<<"------------------------------"<<endl;
} for(int i=;i<=n;i++){
for(int k=;k<=t;k++){
for(int x=;x<=k;x++){
dp[i][k]=max(dp[i][k], dp[i-][k-x]+h[i][x]);
}
}
} cout<<dp[n][t]<<endl; fclose(stdin);
return ;
}
再次提醒自己注意f重用的清零!
code1744 方格染色的更多相关文章
- [BZOJ2303][Apio2011]方格染色
[BZOJ2303][Apio2011]方格染色 试题描述 Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好,他们想要表格中每个2 × ...
- BZOJ_2303_[Apio2011]方格染色 _并查集
BZOJ_2303_[Apio2011]方格染色 _并查集 Description Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好, ...
- bzoj 2303: [Apio2011]方格染色
传送门 Description Sam和他的妹妹Sara有一个包含n × m个方格的表格.她们想要将其的每个方格都染成红色或蓝色.出于个人喜好,他们想要表格中每个2 × 2的方形区域都包含奇数个(1 ...
- BZOJ2303: [Apio2011]方格染色 【并查集】
Description Sam和他的妹妹Sara有一个包含n × m个方格的表格.她们想要将其的每个方格都染成红色或蓝色.出于个人喜好,他们想要表格中每个2 × 2的方形区域都包含奇数个(1 个或 3 ...
- BZOJ 2303 方格染色(带权并查集)
要使得每个2*2的矩形有奇数个红色,如果我们把红色记为1,蓝色记为0,那么我们得到了这2*2的矩形里的数字异或和为1. 对于每个方格则有a(i,j)^a(i-1,j)^a(i,j-1)^a(i-1,j ...
- 【题解】P3631 [APIO2011]方格染色
很有意思的一道题,所以单独拿出来了. 完整分享看 这里 题目链接 luogu 题意 有一个包含 \(n \times m\) 个方格的表格.要将其中的每个方格都染成红色或蓝色.表格中每个 \(2 \t ...
- BZOJ 2303: [Apio2011]方格染色 题解
题目大意: 有n*m的方格,中间的数要么是1,要么是0,要求任意2*2的方格中的数异或和为1.已知一部分格子中的数,求合法的填数的方案数. 思路: 由题意得:a[i][j]^a[i][j+1]^a[i ...
- BZOJ 2303: [Apio2011]方格染色 [并查集 数学!]
题意: $n*m:n,m \le 10^6$的网格,每个$2 \times 2$的方格必须有1个或3个涂成红色,其余涂成蓝色 有一些方格已经有颜色 求方案数 太神了!!!花我三节课 首先想了一下只有两 ...
- BZOJ2303 APIO2011方格染色(并查集)
比较难想到的是将题目中的要求看做异或.那么有ai,j^ai+1,j^ai,j+1^ai+1,j+1=1.瞎化一化可以大胆猜想得到a1,1^a1,j^ai,1^ai,j=(i-1)*(j-1)& ...
随机推荐
- Java Language Changes for Java SE 9
Java9引入了module模块的概念,是类与接口和数据资源的一种封装,并可以声明与其他模块的依赖关系.这里总结一下Java9带来的新特性. 更简练的try-with-resources语句 fina ...
- spring事务传播特性实验(2):PROPAGATION_REQUIRED实验结果与分析
本文延续上一文章(spring事务传播特性实验(1):数据准备),在已经准备好环境的情况下,做如下的实验,以验证spring传播特性,加深对spring传播特性的理解. 本次主要验证PROPAGATI ...
- linux文件权限,用户和组
文件权限 默认权限分配 umask umask是通过八进制的数值来定义用户创建文件或目录的默认权限的 安全权限的临界点是,文件默认权限是644,目录默认权限是755 [root@Poppy joker ...
- JAVA中的IO流介绍(2)
一.流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等. 一个流,必有源端和目的端, ...
- 字体相关CSS属性介绍
font-family 字体系列. font-family可以把多个字体名称作为一个“回退”系统来保存.如果浏览器不支持第一个字体,则会尝试下一个.浏览器会使用它可识别的第一个值. 简单实例: bod ...
- python socket打造一个定位工具
前言: 刚刚学习socket,打算后期得学习 怎么写exploit. 原理: 其实很简单,客户端写个爬虫.然后将获取到的IP放入高德地图 在通过socket发送.利用ngrok达到能外网搞事. 准备: ...
- g++ 4.4.7 template 没问题,前面应该程序问题!!
- java设计模式之责任链模式(Chain of Responsibility)
转自:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html 在阎宏博士的<JAVA与模式>一书中开头是这样 ...
- C#中 标识符“XXX”不符合 CLS
标识符“XXX”不符合 CLS,意思是只要是不与外面有接口,比如在私有函数中操作,可是使用一些不符合cls的类型,但是如果是公共的,就必须要符合这个规范. 解决方法是,将这个类中的这些public类型 ...
- [转] C# 获取程序运行目录
来自 莫等闲也,原文 // 获取程序的基目录. System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径. System.Diagnosti ...