题目链接:http://codeforces.com/problemset/problem/372/B

题意:

  给你一个n*m的01矩阵(1 <= n,m <= 40)。

  然后有t组询问(a,b,c,d),问你:

    在以(a,b)为左上角,以(c,d)为左下角,围成的矩形范围中,有多少全是0的矩形。

题解:

  这题是dp套dp……

  首先解决dp1:

    表示状态:

      f[a][b][c][d] = Rectangles number

      表示左上角为(a,b),右下角的范围在(c,d)以内的全0矩形的个数。

    如何转移:

      f[a][b][c][d] = f[a][b][c-1][d] + f[a][b][c][d-1] - f[a][b][c-1][d-1] + check(a,b,c,d)

      简单的容斥原理。

      其中,如果左上角为(a,b),右下角为(c,d)的矩形中全是0,则check(a,b,c,d)为1,否则为0(要用到二维前缀和)。

    边界条件:

      set f = 0

    复杂度O(N^4)。

  然后解决dp2:

    表示状态:

      dp[a][b][c][d] = Rectangles number

      表示在(a,b)和(c,d)围成的范围内的全0矩形个数。

      显然有:

        dp[a][b][c][d] = ∑ f[i][j][c][d] (a<=i<=c, b<=j<=d)

    如何转移:

      dp[a][b][c][d] = dp[a+1][b][c][d] + dp[a][b+1][c][d] - dp[a+1][b+1][c][d] + f[a][b][c][d]

      还是根据容斥原理,不过在这里a,b,c,d要倒着枚举。

    边界条件:

      set dp = 0

    复杂度O(N^4)。

  所以对于每一次询问,直接输出dp[a][b][c][d]即可。

  总复杂度O(N^4 + t)

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 45 using namespace std; int n,m,t;
int v[MAX_N][MAX_N];
int s[MAX_N][MAX_N];
int f[MAX_N][MAX_N][MAX_N][MAX_N];
int dp[MAX_N][MAX_N][MAX_N][MAX_N]; void read()
{
cin>>n>>m>>t;
char c;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
cin>>c;
v[i][j]=c-'';
}
}
} void cal_s()
{
memset(s,,sizeof(s));
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
s[i][j]=s[i][j-]+s[i-][j]-s[i-][j-]+v[i][j];
}
}
} int check(int a,int b,int c,int d)
{
int sum=s[c][d]-s[c][b-]-s[a-][d]+s[a-][b-];
return sum== ? : ;
} void cal_f()
{
memset(f,,sizeof(f));
for(int a=;a<=n;a++)
{
for(int b=;b<=m;b++)
{
for(int c=a;c<=n;c++)
{
for(int d=b;d<=m;d++)
{
f[a][b][c][d]=f[a][b][c-][d]+
f[a][b][c][d-]-
f[a][b][c-][d-]+
check(a,b,c,d);
}
}
}
}
} void cal_dp()
{
memset(dp,,sizeof(dp));
for(int a=n;a>=;a--)
{
for(int b=m;b>=;b--)
{
for(int c=n;c>=a;c--)
{
for(int d=m;d>=b;d--)
{
dp[a][b][c][d]=dp[a+][b][c][d]+
dp[a][b+][c][d]-
dp[a+][b+][c][d]+
f[a][b][c][d];
}
}
}
}
} void work()
{
cal_s();
cal_f();
cal_dp();
int a,b,c,d;
while(t--)
{
cin>>a>>b>>c>>d;
cout<<dp[a][b][c][d]<<endl;
}
} int main()
{
read();
work();
}

Codeforces 372B Counting Rectangles is Fun:dp套dp的更多相关文章

  1. Codeforces 372B Counting Rectangles is Fun

    http://codeforces.com/problemset/problem/372/B 题意:每次给出一个区间,求里面有多少个矩形 思路:预处理,sum[i][j][k][l]代表以k,l为右下 ...

  2. codeforces 979E(dp套dp)

    题意: 有n个点,编号为1~n.有的点颜色是黑色,有的点颜色是白色,有的点的颜色待涂.你还可以连一些边,但这些边一定是从小编号连到大编号的点. 对于一个确定的图,我们去统计有多少条路径满足“该路径经过 ...

  3. bzoj 3864: Hero meet devil [dp套dp]

    3864: Hero meet devil 题意: 给你一个只由AGCT组成的字符串S (|S| ≤ 15),对于每个0 ≤ .. ≤ |S|,问 有多少个只由AGCT组成的长度为m(1 ≤ m ≤ ...

  4. [模板] dp套dp && bzoj5336: [TJOI2018]party

    Description Problem 5336. -- [TJOI2018]party Solution 神奇的dp套dp... 考虑lcs的转移方程: \[ lcs[i][j]=\begin{ca ...

  5. luogu 4158 粉刷匠 dp套dp

    dp套dp 每个木板是个递推的dp,外部是个分组背包 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i&l ...

  6. DP套DP

    DP套DP,就是将内层DP的结果作为外层DP的状态进行DP的方法. [BZOJ3864]Hero meet devil 对做LCS的DP数组差分后状压,预处理出转移数组,然后直接转移即可. tr[S] ...

  7. 【BZOJ3864】Hero meet devil DP套DP

    [BZOJ3864]Hero meet devil Description There is an old country and the king fell in love with a devil ...

  8. dp 套 dp扯谈

    1.[扯谈概念] \(dp\) 套 \(dp\) 其实也就是 \(dp\) . 这里就定义下面两个概念: 内层 \(dp\) 表示的是被套在里面的那个 \(dp\) 外层 \(dp\) 表示的是最外面 ...

  9. P4590-[TJOI2018]游园会【dp套dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P4590 题目大意 给出一个长度为\(m\)的字符串\(s\). 对于每个\(k\in[0,m]\)求有多少个长度为 ...

随机推荐

  1. TCP可靠传输详解

    TCP提供了可靠的传输服务,这是通过下列方式提供的: 分块发送:应用数据被分割成TCP认为最适合发送的数据块.由TCP传递给IP的信息单位称为报文段或段(segment) 定时确认重传:当TCP发出一 ...

  2. FFmpeg与libx264 x264接口对应关系源代码分析

    源代码位于“libavcodec/libx264.c”中.正是有了这部分代码,使得FFmpeg可以调用libx264编码H.264视频.  从图中可以看出,libx264对应的AVCodec结构体ff ...

  3. 浅析js绑定同一个事件依次触发问题系列(一)

    算了 还是上代码吧  记得写过这篇文章,但是找不到了(对,就是找不到了,算了再写一遍吧) 也是在群中有人问这个绑定不同事件 或者同一个事件的依次触发问题 个人建议如果是一个事件的话那么最好写成函数, ...

  4. iOS --创建文件夹 ,删除文件夹

    //创建文件夹 --> 返回 文件夹 - (NSString *)pathToPatientPhotoFolder { NSString *documentsDirectory = [NSSea ...

  5. Java线程面试题:设计四个线程,其中两个线程每次对 j 加 1,另外两个每次对 j 减 1,程序如下。

    package thread; /** * Java线程面试题 * @author zhongfg * @date 2015-06-16 */ public class ThreadInterview ...

  6. leetCode 57.Insert Interval (插入区间) 解题思路和方法

    Insert Interval  Given a set of non-overlapping intervals, insert a new interval into the intervals ...

  7. 首页底部菜单FragmentTabHost的使用

    一般现在的菜单都是底部FragmentTabHost,切换Fragment来实现的,今天我们就使用这个来看看如何实现的 首先是布局文件 <?xml version="1.0" ...

  8. 洛谷P2296 寻找道路==codevs3731 寻找道路

    P2296 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...

  9. 【BZOJ3672】[Noi2014]购票 树分治+斜率优化

    [BZOJ3672][Noi2014]购票 Description  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.       ...

  10. 多语言中的“默认语言”设置

    最近在搞一个多语言的东西,打算如果用户是中文环境就显示中文,其他任何非中文环境就显示英文.换句话说,把默认语言设置成英文. 不过因为VS是中文的,发现即使默认资源文件是英文(AppResource.r ...