题意:

给出一个 \(n \times m\) 的矩阵,需对其进行黑白染色,使得以下条件成立:

  • 存在区间 \([l,r]\)(\(1\leq l\leq r\leq n\)),使得第 \(l,l+1,\dots,r\) 行恰有 \(2\) 个格子染成黑色,其余行所有格子均为白色。
  • 设第 \(i\) 行染黑的两个格子所在的列为 \(a_i,b_i(a_i\lt b_i)\),那么存在 \(l \leq t \leq r\),使得 \(a_l\geq a_{l+1}\geq a_{l+2}\geq\dots\geq a_t\leq a_{t+1}\leq a_{t+2}\leq\dots\leq a_r\),\(b_l\geq b_{l+1}\geq b_{l+2}\geq\dots\geq b_t\geq b_{t+1}\leq b_{t+2}\leq\dots\leq b_r\)。

    \(n,m \in [1,2000]\)

    答案对 \(10^9+7\) 取模。

很显然可以分上部分和下部分考虑,这里考虑上半部分。

设 \(dp_{i,j}\) 表示填好了 \(i\) 行,第 \(i\) 行的“宽度”(\(b_i-a_i+1\))为 \(j\)。

那么我们枚举上一行的宽度 \(k\),即 \(dp_{i,j}=\sum\limits_{k=2}^jdp_{i-1,k}\times(j-k+1)\)。

前缀和优化可以搞到 \(n^2\)。

然后我们考虑计算答案。

我们枚举上文中提到的 \(t\) 的位置,以及第 \(t\) 行的“宽度” \(w\),注意可能有多个 \(t\) 满足条件,这里我们枚举的是最下方的 \(t\),否则可能会重复计算。

这部分对答案的贡献为 \(f(t,w)=(\sum\limits_{i=1}^tdp_{i,w})\times(1+\sum\limits_{k=1}^{n-i}\sum\limits_{l=2}^{w-1}dp_{k,l}\times(w-l+1))\)

稍微解释一下这个式子。

前面的括号是填好上半部分的方案数,枚举行数求个和即可。

后面的括号的填好下半部分的方案数。第 \(t+1\) 行的宽度必然小于 \(w\),否则 \(t+1\) 也满足条件,我们枚举就不是“最下方的 \(t\)”了。

当然 \(t+1\) 行也可以不染色,贡献为 \(1\)。

预处理三个前缀和就可以 \(\mathcal O(1)\) 求出 \(f(t,w)\)。

最后 \(ans=\sum\limits_{t=1}^n\sum\limits_{w=2}^mf(t,w)\times(m-w+1)\)

#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define fz(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define foreach(it,v) for(__typeof(v.begin()) it=v.begin();it!=v.end();it++)
#define all(a) a.begin(),a.end()
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,0x3f,sizeof(a))
#define y1 y1010101010101
#define y0 y0101010101010
typedef pair<int,int> pii;
typedef long long ll;
const ll MOD=1e9+7;
ll n,m,dp[2005][2005],s1[2005][2005],s2[2005][2005],s[2005][2005],_s[2005][2005],__s[2005][2005];
int main(){
scanf("%d%d",&n,&m);
for(int i=2;i<=m;i++) dp[1][i]=1;
for(int j=2;j<=m;j++){
s1[1][j]=(s1[1][j-1]+dp[1][j])%MOD;
s2[1][j]=(s2[1][j-1]+dp[1][j]*j%MOD)%MOD;
}
for(int i=2;i<=n;i++){
for(int j=2;j<=m;j++){
dp[i][j]=(-s2[i-1][j]+s1[i-1][j]*(j+1)%MOD+MOD)%MOD;
// printf("%d %d %lld\n",i,j,dp[i][j]);
}
for(int j=2;j<=m;j++){
s1[i][j]=(s1[i][j-1]+dp[i][j])%MOD;
s2[i][j]=(s2[i][j-1]+dp[i][j]*j%MOD)%MOD;
}
}
ll ans=0;
for(int i=1;i<=n;i++) for(int j=2;j<=m;j++) s[i][j]=(s[i-1][j]+dp[i][j])%MOD;
for(int i=1;i<=n;i++) for(int j=2;j<=m;j++) _s[i][j]=(_s[i][j-1]+s[i][j])%MOD;
for(int i=1;i<=n;i++) for(int j=2;j<=m;j++) __s[i][j]=(__s[i][j-1]+s[i][j]*j%MOD)%MOD;
for(int i=1;i<=n;i++) for(int j=2;j<=m;j++){
ans=(ans+s[i][j]*(_s[n-i][j-1]*(j+1)%MOD-__s[n-i][j-1]+MOD+1)%MOD*(m-j+1)%MOD)%MOD;
// printf("%d %d %lld\n",i,j,s[i][j]*(_s[n-i][j-1]*(j+1)%MOD-__s[n-i][j-1]+MOD+1)%MOD*(m-j+1)%MOD);
}
printf("%lld\n",ans);
return 0;
}
/*
dp[i][j]=\sum dp[i-1][k]*(j-k+1)
\sum s[x][k]*(j-k+1)
*/

Codeforces 295D - Greg and Caves(dp)的更多相关文章

  1. CodeForces - 710E Generate a String (dp)

    题意:构造一个由a组成的串,如果插入或删除一个a,花费时间x,如果使当前串长度加倍,花费时间y,问要构造一个长度为n的串,最少花费多长时间. 分析:dp[i]---构造长度为i的串需要花费的最短时间. ...

  2. [CodeForces - 296D]Greg and Graph(floyd)

    Description 题意:给定一个有向图,一共有N个点,给邻接矩阵.依次去掉N个节点,每一次去掉一个节点的同时,将其直接与当前节点相连的边和当前节点连出的边都需要去除,输出N个数,表示去掉当前节点 ...

  3. Educational Codeforces Round 51 D. Bicolorings(dp)

    https://codeforces.com/contest/1051/problem/D 题意 一个2*n的矩阵,你可以用黑白格子去填充他,求联通块数目等于k的方案数,答案%998244353. 思 ...

  4. Codeforces 536D - Tavas in Kansas(dp)

    Codeforces 题目传送门 & 洛谷题目传送门 其实这题本该 2019 年 12 月就 AC 的(详情请见 ycx 发此题题解的时间),然鹅鸽到了现在-- 首先以 \(s,t\) 分别为 ...

  5. Codeforces 467C George and Job(DP)

    题目 Source http://codeforces.com/contest/467/problem/C Description The new ITone 6 has been released ...

  6. Codeforces A ACM (ACronym Maker) (dp)

    http://codeforces.com/gym/100650 概要:给出一个缩写,和一些单词,从单词中按顺序选一些字母作为缩写,问方案数. 限制:某些单词要忽略,每个单词至少要选一个字母. dp[ ...

  7. codeforces 813 D. Two Melodies(dp)

    题目链接:http://codeforces.com/contest/813/problem/D 题意:求两个不相交的子集长度之和最大是多少,能放入同一子集的条件是首先顺序不能变,然后每一个相邻的要么 ...

  8. codeforces 762 D. Maximum path(dp)

    题目链接:http://codeforces.com/problemset/problem/762/D 题意:给出一个3*n的矩阵然后问从左上角到右下角最大权值是多少,而且每一个点可以走上下左右,但是 ...

  9. CodeForces - 446A DZY Loves Sequences(dp)

    题意:给定一个序列a,求最长的连续子序列b的长度,在至多修改b内一个数字(可修改为任何数字)的条件下,使得b严格递增. 分析: 1.因为至多修改一个数字,假设修改a[i], 2.若能使a[i] < ...

随机推荐

  1. vue 解决axios请求出现前端跨域问题

    vue 解决axios请求出现前端跨域问题 最近在写纯前端的vue项目的时候,碰到了axios请求本机的资源的时候,出现了访问报404的问题.这就让我很难受.查询了资料原来是跨域的问题. 在正常开发中 ...

  2. 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS

    词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...

  3. anaconda+pytorch安装

    环境配置说明: 因项目需要,需要写一个说明文档交付公司人员,指导其进行环境的安装 1. 安装 Anaconda 进入清华开源软件镜像站,其网址如下:https://mirrors.tuna.tsing ...

  4. [Beta]the Agiles Scrum Meeting 3

    会议时间:2020.5.14 20:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 yjy 实现前端界面美化 tq 实现查看.删除测试点功能的前端修复功能中的bug wjx 升级系统实现 ...

  5. 用cmd命令行创建vue项目模板

    1.进入cmd命令行 输入存放项目的位置 2.通过vue create 项目名称 创建项目 3.选择Manually select features 4.通过空格选中第1.2.5.6.7.去掉8 4. ...

  6. 单源最短路径算法:迪杰斯特拉 (Dijkstra) 算法(一)

    一.算法介绍 迪杰斯特拉算法(英语:Dijkstra's algorithm)由荷兰计算机科学家艾兹赫尔·迪杰斯特拉在1956年提出.迪杰斯特拉算法使用了广度优先搜索解决赋权有向图的单源最短路径问题. ...

  7. spring cloud Alibaba --sentinel组件的使用

    sentinel组件 对于sentinel的前置知识这里就不多说了: 直接上代码: Release v1.8.1 · alibaba/Sentinel · GitHub  下载地址 springclo ...

  8. Vulnstack内网靶场3

    Vulnstack内网靶场3 (qiyuanxuetang.net) 环境配置 打开虚拟机镜像为挂起状态,第一时间进行快照,部分服务未做自启,重启后无法自动运行. 挂起状态,账号已默认登陆,cento ...

  9. hdu 1861 游船出租(模拟题,,水)

    题意: 现有公园游船租赁处请你编写一个租船管理系统. 当游客租船时,管理员输入船号并按下S键,系统开始计时:当游客还船时,管理员输入船号并按下E键,系统结束计时. 船号为不超过100的正整数.当管理员 ...

  10. u-boot 1.1.6 start.S 代码学习<转>

    ---转自 http://blog.csdn.net/rockhard/article/details/4166642 ------ /* 参考了别人的一些笔记,看完了启动代码. 本文档记录在看代码时 ...