CodeForces 611C New Year and Domino (动态规划,DP)
题意:给定一个h*w的网格,里面只有.和#,.表示空的,#表示禁止的,然后有q个询问,询问中给你两个坐标,分别是左上和右下,求在这两者中间的有多少种(竖着和横着)两个相邻的点。
析:一看到这个题目,肯定是DP,一想,不会做,想了好久都不会,这怎么分析呢,横着和竖着明明就是混合的,怎么考虑呢,想了好久都没想出来。后来偷偷问一下别人,哦,原来就是分开考虑的。
分开考虑就是行的考虑行的,列的考虑列的,最后再相加就好了,我们用dr[i][j]来表示第i行到第j个位置的种数,同样的列dc[i][j]第i列到第j个位置的种数。
因为行和列类似,我们就分析行,如果第j-1个是.,那么总数就会多一个,否则总数和和j-1时一样,再考虑一下边界,即:if(G[i][j] == '.' && G[i][j-1] == '.')    dr[i][j] = dr[i][j-1] + 1;  
else     dr[i][j] = dr[i][j-1];
同理列也是如此,
if(G[i][j] == '.' && G[i-1][j] == '.') dc[i][j] = dc[i-1][j] + 1;
else dc[i][j] = dc[i-1][j];剩下的就是如何去从左上角到右下角的满足条件种数了,就是每一行(列)用最后那个坐标减掉最前面那个坐标,这就是这一行(列)的总数,再分别加起来就是最后答案了。
代码如下:
#include <iostream>
#include <cstdio>
#include <vector>
#include <set>
#include <queue>
#include <iomanip>
#include <cstring>
#include <sstream>
#include <algorithm>
#include <map>
#include <list> using namespace std;
typedef long long LL;
const int maxn = 500 + 10;
char G[maxn][maxn];
int dr[maxn][maxn], dc[maxn][maxn]; int main(){
int r, c;
cin >> r >> c;
for(int i = 1; i <= r; ++i)
scanf("%s", G[i]+1); memset(dr, 0, sizeof(dr));
memset(dc, 0, sizeof(dc));
for(int i = 1; i <= r; ++i){
for(int j = 1; j <= c; ++j){
if(G[i][j] == '.' && G[i][j-1] == '.') dr[i][j] = dr[i][j-1] + 1;
else dr[i][j] = dr[i][j-1];
if(G[i][j] == '.' && G[i-1][j] == '.') dc[i][j] = dc[i-1][j] + 1;
else dc[i][j] = dc[i-1][j];
}
} int q; cin >> q;
while(q--){
int x1, y1, x2, y2;
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
int cnt = 0;
for(int i = x1; i <= x2; ++i){
cnt += dr[i][y2] - dr[i][y1];
}
for(int i = y1; i <= y2; ++i){
cnt += dc[x2][i] - dc[x1][i];
}
printf("%d\n", cnt); }
return 0;
}
CodeForces 611C New Year and Domino (动态规划,DP)的更多相关文章
- Codeforces 611C. New Year and Domino 动态规划
		C. New Year and Domino time limit per test 3 seconds memory limit per test 256 megabytes input stand ... 
- Codeforces 611C New Year and Domino  DP+容斥
		"#"代表不能放骨牌的地方,"."是可以放 500*500的矩阵,q次询问 开两个dp数组,a,b,a统计横着放的方案数,b表示竖着放,然后询问时O(1)的,容 ... 
- Codeforces 611C New Year and Domino(二维前缀和)
		题目大概说给一个n*m个格子,格子'.'表示可以放东西,多次询问矩形区域(x1,y1)-(x2,y2)有几种放一张1*2的骨牌的方案数. 分别考虑横着竖着放,预处理出二维的前缀和,即sum[x][y] ... 
- Codeforces Round #335 Sorting Railway Cars 动态规划
		题目链接: http://www.codeforces.com/contest/606/problem/C 一道dp问题,我们可以考虑什么情况下移动,才能移动最少.很明显,除去需要移动的车,剩下的车, ... 
- Codeforces 219D. Choosing Capital for Treeland (树dp)
		题目链接:http://codeforces.com/contest/219/problem/D 树dp //#pragma comment(linker, "/STACK:10240000 ... 
- 动态规划dp
		一.概念:动态规划dp:是一种分阶段求解决策问题的数学思想. 总结起来就一句话:大事化小,小事化了 二.例子 1.走台阶问题 F(10):10级台阶的走法数量 所以:F(10)=F(9)+F(8) F ... 
- 算法-动态规划DP小记
		算法-动态规划DP小记 动态规划算法是一种比较灵活的算法,针对具体的问题要具体分析,其宗旨就是要找出要解决问题的状态,然后逆向转化为求解子问题,最终回到已知的初始态,然后再顺序累计各个子问题的解从而得 ... 
- [CodeForces - 1272D] Remove One Element 【线性dp】
		[CodeForces - 1272D] Remove One Element [线性dp] 标签:题解 codeforces题解 dp 线性dp 题目描述 Time limit 2000 ms Me ... 
- 【CodeForces 611C】New Year and Domino
		题 题意 h行w列的矩形格子,“." 代表空的,"#" 代表满的,多米诺是 1*2 的长方体,现在放进格子,给你子矩形的左上角和右上角,问在子矩形里共有多少种放一块多米诺 ... 
随机推荐
- vue基础——表单输入绑定
			一.基础用法 你可以用 v-model 指令在表单 <input> 及 <textarea> 元素上创建双向数据绑定.它会根据控件类型自动选择正确的方法来更新元素. 尽管有些神 ... 
- vue基础——vue介绍
			声明式渲染——文本插值: 数据和dom已经进行了关联,所有东西都是响应式的 index.html <div id="app0"> {{message}} </di ... 
- Python 3 学习笔记(1)
			Python 3.6 运算符 + - * / 四则运算 % 求余 **乘方 // 用于整除 字符串 字符串用单引号或双引号括起来. 三引号(单引号或双引号均可)表示多行字符串,行末加反斜杠表示换行不算 ... 
- 【Java】JVM(二)、Java垃圾收集算法
			一.标记-清除算法 算法主要分为两个步骤 1. 标记: 遍历所有的 GC Roots, 然后标记所有可达对象为存活对象 2. 清除: 遍历堆中所有对象,然后将没有标记的对象清除. 存在不足: 1. 效 ... 
- Nsis Sqlite Plugin
			1.https://stackoverflow.com/questions/15346338/nsis-and-sqlite-integration 2.http://nsis.sourceforge ... 
- Egit的merge合并冲突具体解决方法
			稍微总结下弄了半个下午的egit的merge合并冲突解决方法,网上看的都是一个模板出来的,看的糊里糊涂,花了很多时间去实验整个合并流程.. 前提工作 创建一个普通JAVA工程Test,创建一个类Tes ... 
- 在c#下用 WCF编写restful
			1.添加WCF服务库 2.在global里面注册路由 RouteTable.Routes.Add(new ServiceRoute("api", new WebServiceHos ... 
- window环境mysql解压版配置
			1.下载并解压 到官网下载mysql-5.5.10-win32.zip,然后将mysql解压到任意路径,如:C:\mysql-5.5.10-win32 2.设置环境变量 打开计算机->属性-&g ... 
- Android Studio和SDK下载、安装和环境变量配置
			win10下Android Studio和SDK下载.安装和环境变量配置 - ... 
- 实验1:c++简单程序设计(1)
			//文中有格式错误请无视 //这个编辑器一言难尽 实验目的 1. 掌握c++中类c部分的编程知识: 数据类型,常量,变量,运算符,表达式,分支结构,循环结构 2. 掌握C++中数据输入和输出的基本方法 ... 
