Codeforces 373D Counting Rectangles is Fun【Dp】
来源:互联网 发布:网店美工下载 编辑:程序博客网 时间:2024/05/21 23:57
There is an n × m rectangular grid, each cell of the grid contains a single integer: zero or one. Let's call the cell on the i-th row and the j-th column as (i, j).
Let's define a "rectangle" as four integers a, b, c, d (1 ≤ a ≤ c ≤ n; 1 ≤ b ≤ d ≤ m). Rectangle denotes a set of cells of the grid{(x, y) : a ≤ x ≤ c, b ≤ y ≤ d}. Let's define a "good rectangle" as a rectangle that includes only the cells with zeros.
You should answer the following q queries: calculate the number of good rectangles all of which cells are in the given rectangle.
There are three integers in the first line: n, m and q (1 ≤ n, m ≤ 40, 1 ≤ q ≤ 3·105). Each of the next n lines contains m characters — the grid. Consider grid rows are numbered from top to bottom, and grid columns are numbered from left to right. Both columns and rows are numbered starting from 1.
Each of the next q lines contains a query — four integers that describe the current rectangle, a, b, c, d (1 ≤ a ≤ c ≤ n; 1 ≤ b ≤ d ≤ m).
For each query output an answer — a single integer in a separate line.
5 5 500101000000000101000000011 2 2 44 5 4 51 2 5 22 2 4 54 2 5 3
1017345
4 7 500001000000010001100000000001 7 2 73 1 3 12 3 4 51 2 2 72 2 4 7
31162752
For the first example, there is a 5 × 5 rectangular grid, and the first, the second, and the third queries are represented in the following image.
- For the first query, there are 10 good rectangles, five 1 × 1, two 2 × 1, two 1 × 2, and one 1 × 3.
- For the second query, there is only one 1 × 1 good rectangle.
- For the third query, there are 7 good rectangles, four 1 × 1, two 2 × 1, and one 3 × 1.
题目大意:
给出一个N*M的矩阵,有Q个查询,每个查询表示询问区间内有多少个全0子矩阵。
思路:
设定Dp【i】【j】【k】【l】表示区间(【a,b】【c,d】)内全0子矩阵的个数。
那么状态转移方程有:
Dp【i】【j】【k】【l】=Dp【i】【j】【k-1】【l】+Dp【i】【j】【k】【l-1】-Dp【i】【j】【k-1】【l-1】+以点(k,l)结尾能够组成的全0子矩阵的个数。
那么O(n^2*m^2)预处理然后O(1)查询答案即可。
Ac代码:
#include<stdio.h>#include<iostream>#include<string.h>using namespace std;int row[55][55];char a[55][55];int dp[55][55][55][55];int main(){ int n,m,q; while(~scanf("%d%d%d",&n,&m,&q)) { for(int i=1;i<=n;i++) { scanf("%s",a[i]+1); } memset(dp,0,sizeof(dp)); memset(row,0,sizeof(row)); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(a[i][j]=='0') row[i][j]=row[i][j-1]+1; else row[i][j]=0; } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { for(int k=i;k<=n;k++) { for(int l=j;l<=m;l++) { dp[i][j][k][l]=dp[i][j][k][l-1]+dp[i][j][k-1][l]-dp[i][j][k-1][l-1]; int r=l-j+1; for(int z=k;z>=i;z--) { r=min(r,row[z][l]); dp[i][j][k][l]+=r; } } } } } while(q--) { int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d); printf("%d\n",dp[a][b][c][d]); } }}
- Codeforces 373D Counting Rectangles is Fun【Dp】
- CF 373D Counting Rectangles is Fun 单调栈+DP
- Codeforces Round #219 (Div. 2) D. Counting Rectangles is Fun
- CodeForces 372B. Counting Rectangles is Fun
- B. Counting Rectangles is Fun----dp
- codeforces 372B B. Counting Rectangles is Fun(暴力)
- CF 372B Counting Rectangles is Fun [dp+数据维护]
- Codeforce 373 D Counting Rectangles is Fun (统计全0子矩阵)
- codeforces #373 C.Counting Kangaroos is Fun
- Codeforces 372B. Counting Rectangles is Fun【动态规划,暴力枚举】(lowbit()小用法)
- CF 372B Counting Rectangles is Fun(记忆化搜索)
- 【CodeForces】373C - Counting Kangaroos is Fun(二分)
- M - Counting Kangaroos is Fun . Codeforces 373C
- Codeforces 373C:Counting Kangaroos is Fun(二分+贪心)
- Codeforces 373C Counting Kangaroos is Fun 二分+贪心
- Codeforces 373C Counting Kangaroos is Fun【贪心】
- CodeForces 372 A. Counting Kangaroos is Fun
- 【CodeForces】[372A]Counting Kangaroos is Fun
- 表格打印-字符串列表的列表
- 图解图的存储结构
- BZOJ 1856 [Scoi2010]字符串
- 面向对象的异常处理机制
- 一张图看懂docker命令
- Codeforces 373D Counting Rectangles is Fun【Dp】
- JavaScript之WebSocket 技术
- mycat1.6.5分片(按照天分片)
- Java 基础集合转换(数组、List、Set、Map相互转换)
- nginx日志格式
- 文本处理相关资料整理
- 从生活看AOP
- 【Python-3.5】绘制世界人口地图
- UVa 401 Palindromes