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)& ...
随机推荐
- AT命令控制上网 PDP
1. AT+CGATT=1 (Attach or detach from GPRS service, GPRS 附着状态) 说的简单点,这一步就是让SGSN (服务GPRS节点,你可以把它理解成与基站 ...
- Ten Qualities of an Effective Team Player
If you were choosing team members for a business team in your organization, who would the best team ...
- 用活Firewalld防火墙之direct
原文地址:http://www.excelib.com/article/294/show 学生在前面已经给大家介绍过了Firewalld中direct的作用,使用他可以直接使用iptables.ip6 ...
- java web 程序---在线时长
思路:toLocalString()这个方法 <body> <% long t=session.getLastAccessedTime(); long t2=session.getC ...
- 013:Rank、视图、触发器、MySQL内建函数
一. Rank 给出不同的用户的分数,然后根据分数计算排名 (gcdb@localhost) 09:34:47 [mytest]> create table t_rank(id int,scor ...
- 关于select的一个死循环
#include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <sys/sel ...
- 设计模式—单例模式(java)
一:懒汉式 1: 线程安全的双重锁检查机制 public class Singleton{ private Singleton() {} // 私有构造函数,保证不被外界实例化(不考虑反射) ...
- PyQt 5布局管理
绝对定位 绝对定位有以下限制 1.如果调整窗口,控件的大小和位置不会改变 2.在各种平台上应用程序看起来不会一样 3.如果改变字体,我们的应用程序的布局就会改变 4.如果我们决定改变我们的布局,我们必 ...
- 【UVA】673 Parentheses Balance(栈处理表达式)
题目 题目 分析 写了个平淡无奇的栈处理表达式,在WA了5发后发现,我没处理空串,,,,(或者说鲁棒性差? 代码 #include <bits/stdc++.h> usin ...
- python 之 Collections模块
官方文档:https://yiyibooks.cn/xx/python_352/library/collections.html 参考: https://blog.csdn.net/songfreem ...