[CF225C] Barcode (简单DAG上dp)
题目链接:http://codeforces.com/problemset/problem/225/C
题目大意:给你一个矩阵,矩阵中只有#和.两种符号。现在我们希望能够得到一个新的矩阵,新的矩阵满足每一列都只有一种符号,并且连续相同符号的列数在区间[x,y]之间。
解:
现将列中的点统计出来,然后就是枚举把列数在x到y之间的需要更改为点的统计出来。这些点染上白色。
然后再将列数在x到y之间的需要更改为井号的点数统计出来,这些点染成黑色。
接下来就是DAG上的动态规划了,dp[i]代表从i到终点的最短路径。路径要求:相邻两个点的颜色不相同。
我是用的记忆化搜索,当然也很好改成递推。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <bitset>
#include <cmath>
#include <numeric>
#include <iterator>
#include <iostream>
#include <cstdlib>
#include <functional>
#include <queue>
#include <stack>
#include <string>
using namespace std;
#define PB push_back
#define MP make_pair
#define SZ size()
#define ST begin()
#define ED end()
#define CLR clear()
#define ZERO(x) memset((x),0,sizeof(x))
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;
const double EPS = 1e-;
const int INF = ;
const int MAX_N = ;
struct NODE{
int l,r,val;
}; vector<NODE> vec[MAX_N][];
int n,m,x,y;
int a[MAX_N],sum[MAX_N],sumn[MAX_N];
int dp[MAX_N][]; int f(int st,int type){
int res = INF;
if( dp[st][type]!=INF ){
return dp[st][type];
}
for(int j=;j<vec[st][type].size();j++){
if(vec[st][type][j].r==m)
res = min(res,vec[st][type][j].val);
}
for(int j=;j<vec[st][type].size();j++) {
if(vec[st][type][j].r!=m)
res = min(res,vec[st][type][j].val+f(vec[st][type][j].r+,-type));
}
return dp[st][type] = res;
} int main(){
scanf("%d%d%d%d",&n,&m,&x,&y);
ZERO(a);
for(int i=;i<=n;i++){
getchar();
for(int j=;j<=m;j++){
char c = getchar();
if( c=='.' ){
a[j]++;
}
}
} for(int i=;i<=m;i++){
sum[i] = sum[i-]+a[i];
sumn[i] = sumn[i-]+n-a[i];
//dp[i] = INF;
} for(int i=;i<=m;i++){
for(int j=x;j<=y;j++){
NODE N;
N.l = i;
N.r = i+j-;
if( N.r>m ) break;
N.val = sum[N.r] - sum[N.l-];
vec[N.l][].PB(N);
N.val = sumn[N.r] - sumn[N.l-];
vec[N.l][].PB(N);
}
}
for(int i=;i<MAX_N;i++){
dp[i][] = dp[i][] = INF;
}
int ans = f(,);
//for(int i=1;i<=m;i++) printf("%d ",dp[i]); puts("");
//for(int i=1;i<=m;i++) dp[i] = INF;
ans = min(ans,f(,));
//for(int i=1;i<=m;i++) printf("%d ",dp[i]); puts("");
printf("%d\n",ans);
return ;
}
[CF225C] Barcode (简单DAG上dp)的更多相关文章
- [正经分析] DAG上dp两种做法的区别——拓扑序与SPFA
		
在下最近刷了几道DAG图上dp的题目. 要提到的第一道是NOIP原题<最优贸易>.这是一个缩点后带点权的DAG上dp,它同时规定了起点和终点. 第二道是洛谷上的NOI导刊题目<最长路 ...
 - bzoj1093: [ZJOI2007]最大半连通子图  scc缩点+dag上dp
		
一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G'=(V ...
 - DAG上dp思想
		
DAG上DP的思想 在下最近刷了几道DAG图上dp的题目.要提到的第一道是NOIP原题<最优贸易>.这是一个缩点后带点权的DAG上dp,它同时规定了起点和终点.第二道是洛谷上的NOI导刊题 ...
 - BZOJ5017 [Snoi2017]炸弹[线段树优化建边+scc缩点+DAG上DP/线性递推]
		
方法一: 朴素思路:果断建图,每次二分出一个区间然后要向这个区间每个点连有向边,然后一个环的话是可以互相引爆的,缩点之后就是一个DAG,求每个点出发有多少可达点. 然后注意两个问题: 上述建边显然$n ...
 - EOJ Monthly 2019.2 E 中位数 (二分+中位数+dag上dp)
		
题意: 一张由 n 个点,m 条边构成的有向无环图.每个点有点权 Ai.QQ 小方想知道所有起点为 1 ,终点为 n 的路径中最大的中位数是多少. 一条路径的中位数指的是:一条路径有 n 个点,将这 ...
 - bzoj1179: [Apio2009]Atm scc缩点+dag上dp
		
先把强连通缩点,然后变成了dag,dp求终点是酒吧的最长路即可, /************************************************************** Pro ...
 - 【模板】缩点(tarjan,DAG上DP)
		
题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只 ...
 - UVA 437 巴比伦塔 【DAG上DP/LIS变形】
		
[链接]:https://cn.vjudge.net/problem/UVA-437 [题意]:给你n个立方体,让你以长宽为底,一个个搭起来(下面的立方体的长和宽必须大于上面的长和宽)求能得到的最长高 ...
 - uva 437 巴比伦塔(DAG上dp)
		
巴比伦塔 紫书P269 看完紫书,终于可以自己写一个dp了 :) [题目链接]巴比伦塔 [题目类型]DAG上dp &题意: 有n种立方体 n<=30,每种有无穷个,要求选一些立方体摞成一 ...
 
随机推荐
- Winform TreeList递归绑定树节点
			
/// <summary> /// 绑定树目录 /// </summary> /// <param name="parentId">父ID< ...
 - Linux 编译 websocket++
			
下载boost 库wget -O boost_last.zip http://downloads.sourceforge.net/project/boost/boost/1.58.0/boost_1_ ...
 - Jupyter notebook 安装,初步使用
			
在学习算法,图像处理过程中,理论结合实际的时候总要写一些程序,我用的是PYTHON.这时候,选择一款称手的工具比较重要.之前我用自带的IDLE,也还可以,但是操作不够便捷,文件组织也不是很好.后来想用 ...
 - Oracle数据库高效sql语句的整理
			
业务需求说明:由于之前公司后台APP端有一个document表,该表中包含了所有的信息,新的需求就是通过该表创建出一个新的用户表(usertable)和一个档案表(document,该表只保留原doc ...
 - 实时刷新Winform中Label的Text
			
最直白的例子: private void btnStart_Click(object sender, EventArgs e) { ; ) { labelTime.Text = i.ToString( ...
 - AngularJS从构建项目开始
			
AngularJS从构建项目开始 AngularJS体验式编程系列文章,将介绍如何用angularjs构建一个强大的web前端系统.angularjs是由Google团队开发的一款非常优秀web前端框 ...
 - 第二个Sprint冲刺项目github
			
https://github.com/22shaojiawen/the-second-sprint-project
 - H - R(N)
			
H - R(N) Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Sta ...
 - TCP/IP 协议:IP 协议
			
首先来看一下IP协议在实际中的位置: 我们只关系流程,不关系当前具体的服务类型 1.IP协议概述 作用: 从上图或从应用层->运输层->网络层->链路层来看,IP协议属于网络层,也就 ...
 - bootstrap-6
			
表格:bootstrap为表格提供了1种基础样式和4种附加样式以及一个支持响应式的表格.主要包括: .table:基础表格 .table-striped:斑马线表格 .table-bordered:带 ...