[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,每种有无穷个,要求选一些立方体摞成一 ...
随机推荐
- appcan.windw.open appcan.frame.open appcan.window.openPopOver evaluateScript
在模拟器上,几种发方式产生的窗口,其实都是iframe. 在根窗口(app打开的第一个)执行JS: try{ appcan.window.evaluateScript( { name: 'root', ...
- GUI用户界面编程
Java的GUI编程(Graphic User Interface,图形用户接口),是在它的抽象窗口工具箱(Abstract Window Toolkit,AWT)上实现的,java.awt是AWT的 ...
- 解决iOS8安装企业版无反应问题
iOS7可以下载没有任何问题,iOS8发现挂在官网上的企业版的app点击了提示是否安装应用程序,但是确认以后没有反应,找了很久,都没有发现问题.后来查看了的device console发现安装的时候出 ...
- Hadoop随笔(一):工作流程的源码
一.几个可能会用到的属性值 1.mapred.map.tasks.speculative.execution和mapred.reduce.tasks.speculative.execution 这两个 ...
- Git 一次性 pull push 所有的分支
/********************************************************************************* * Git 一次性 pull pu ...
- sqlserver OpenRowSet 对应的三种数据库驱动
在使用sqlserver数据库的OpenRowSet函数时,会遇到三种驱动方式: 1. MSDASQL驱动SELECT TOP 10 * FROM OPENROWSET('MSDASQL', 'DRI ...
- 网页左上角图标 favicon.ico
显示网页左上角标志图标 <link rel="shortcut icon" type="image/x-icon" href="images/f ...
- UVa 156 (映射 map)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- C#中动态读写App.config配置文件
转自:http://blog.csdn.net/taoyinzhou/article/details/1906996 app.config 修改后,如果使用cofnigurationManager立即 ...
- python 列表操作
列表的基本操作示例展示: append 功能:列表追加元素 name = ['sd','dfdf','drer'] name.append('sdsd') 返回结果:name ['sd', 'dfdf ...