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 的长方体,现在放进格子,给你子矩形的左上角和右上角,问在子矩形里共有多少种放一块多米诺 ...
随机推荐
- 前端-CSS-6-盒子模型
上面的布局宽度div{ width: 200px; height: 200px; border: 10px solid red; padding: 20px; } ------------------ ...
- cmd 查看本地端口被占用程序
netstat -ano 列出当前活动的网络连接 参数:-a所有侦听端口 -n以数字格式显示地址和端口号 -o显示进程号 tasklist|find "8888" 找出占用888 ...
- js中Math.round、parseInt、Math.floor和Math.ceil小数取整小结
以前经常在代码中看到Math.round.parseInt.Math.floor和Math.ceil这四个函数,虽然知道结果都可以返回一个整数,但是对他们四者的区别还是不太清楚,今天就做一个小结. 一 ...
- sqlserver table partion
SQL SERVER 表分区实施步奏 1. 概要说明 SQL SERVER的表分区功能是为了将一个大表(表中含有非常多条数据)的数据根据某条件(仅限该表的主键)拆分成多个文件存放,以提高查询数据时 ...
- js中常见的内置对象
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- idea 安装uml 画图工具
centos7上: yum -y install graphviz mac上: brew install Graphviz file -> setting->plugins 安装plant ...
- Electron mouse events 参数解析
1.https://electronjs.org/docs/api/web-contents 2.通常用: monitorEvents(document.body, 'mouse') 检测正常的值: ...
- The maximum column size is 767 bytes (Mysql)
ERROR app.wsutils 419 INCRON: Error: ('HY000', '[HY000] [MySQL][ODBC 5.2(w) Driver][mysqld-5.7.7-rc ...
- zg项目 应用系统编码原则
一.编码说明: 1.系统编码采用三码为原则,通常两码简称之. 1>.子系统或类型 2>.系统小分类 3>.系统大分类 如 IPMS领域业务群: DA 应用软件发展管理系统 DE公用副 ...
- swift iOS开发初步使用
使用Xcode6-Beta 创建一个swift空的工程,新建一个UIViewController,语言选择swift. 在MainViewController.swift 添加如下代码,声明变量及cl ...