那天和机房的同学们一起想了很久,然而并没有做出来……今天看了题解,的确比较巧妙,不过细细想来其实规律还是比较明显,在这里记录一下~

  当天自己做的时候,主要想到的是两点 : 1.按列dp 2.对行进行排序。虽然没有做出来,但做法的确和这两点是重合的。我们考虑强制满足左端点,然后 dp 右端点的方法,记录状态 \(f[i][j][k]\) 为 dp 到第 \(i\) 列时,有 \(j\) 列是空的,且还有 \(k\) 个右端点没有满足(这 \(k\) 个右端点的位置均 \(<= i\))。

  首先从 \(i\) 转移到 \(i + 1\) 的条件就是 \(j + 1 >= b[i + 1]\) 其中 b 数组存的是以 \(x\) 为左端点的行数。这样做的本质就是将行按照左端点从小到大排序之后依次满足,端点为 \(x\) 的就强制在转移到第 \(x\) 列的时候去进行考虑(一方面一定要满足,另一方面可以放的范围已经限制了)。转移的时候我们分成三种情况:强制第 \(i\) 列不放 / 放一个满足左端点,满足一个右端点和放在一个空白的位置。对于后面两种转移,只有当 \(j >= b[i + 1]\) 时才会发生(说明我们可以选择将多出来的这一行去用于满足右端点 、放在空白)。这样就只需要讨论一下满足的是哪一个右端点和空白,对于一起转移的满足的左端点乘上排列数以统计不同的方案就可以了。

  很棒的题,奈何自己太弱啦……加油ヾ(◍°∇°◍)ノ゙

#include <bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define maxn 205
#define int long long
int n, m, a[maxn], b[maxn], c[maxn];
int ans, f[maxn][maxn][maxn];
int fac[maxn], P[maxn][maxn]; int read()
{
int x = , k = ;
char c; c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void pre()
{
for(int i = ; i <= m; i ++) P[i][] = ;
for(int i = ; i <= m; i ++)
for(int j = ; j <= i; j ++)
P[i][j] = (P[i - ][j - ] + P[i - ][j]) % mod;
fac[] = ;
for(int i = ; i <= m; i ++) fac[i] = fac[i - ] * i % mod;
for(int i = ; i <= m; i ++)
for(int j = ; j <= i; j ++)
P[i][j] = P[i][j] * fac[j] % mod;
} void Up(int &x, int y) { x = (x + y) % mod; } void DP()
{
f[][][] = ;
for(int i = ; i < m; i ++)
for(int j = ; j <= i; j ++)
for(int k = ; k <= n; k ++)
{
if(!f[i][j][k]) continue;
if(j + >= b[i + ])
{
int tem = f[i][j][k] * P[j + ][b[i + ]] % mod;
Up(f[i + ][j + - b[i + ]][k + c[i + ]], tem);
}
if(j >= b[i + ])
{
int tem = f[i][j][k] * a[i + ] % mod * P[j][b[i + ]] % mod;
Up(f[i + ][j - b[i + ]][k + c[i + ]], tem);
if(k + c[i + ])
{
tem = f[i][j][k] * (k + c[i + ]) % mod * P[j][b[i + ]] % mod;
Up(f[i + ][j - b[i + ]][k + c[i + ] - ], tem);
}
}
}
} signed main()
{
n = read(), m = read();
for(int i = ; i <= n; i ++)
{
int l = read(), r = read();
for(int j = l + ; j <= m - r; j ++) a[j] ++;
b[l] ++, c[m - r + ] ++;
}
pre(); DP();
for(int i = ; i <= m; i ++) Up(ans, f[m][i][]);
printf("%lld\n", ans);
return ;
}

【题解】51nod1327 棋盘游戏的更多相关文章

  1. 题解-bzoj3901 棋盘游戏

    2019年第一篇文章 (。・∀・)ノ゙ Problem bzoj无良权限题,拿学长的号交的 题目概要:给定一个\(n\times n\)的矩阵.令\(x=\frac {n+1}2\).可以进行任意次以 ...

  2. 51nod1327 棋盘游戏

    远古大坑 神仙DP状态设计题 https://blog.csdn.net/white_elephant/article/details/83592103 从行的角度入手,无论如何都要状压 每列最多放一 ...

  3. 1358 棋盘游戏[状压dp]

    1358 棋盘游戏  时间限制: 1 s  空间限制: 64000 KB  题目等级 : 大师 Master 题解  查看运行结果     题目描述 Description 这个游戏在一个有10*10 ...

  4. HDU1281: 棋盘游戏(二分图匹配)

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. LOJ 一本通一句话题解系列:

    第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...

  6. HDU1281 棋盘游戏 —— 二分图最大匹配 + 枚举

    题目链接:https://vjudge.net/problem/HDU-1281 棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit ...

  7. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  8. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  9. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

随机推荐

  1. springBoot -webSocket 基于STOMP协议交互

    浅谈WebSocket WebSocket是在HTML5基础上单个TCP连接上进行全双工通讯的协议,只要浏览器和服务器进行一次握手,就可以建立一条快速通道,两者就可以实现数据互传了.说白了,就是打破了 ...

  2. CakePHP Model中( 获取Session)使用Component的方法

    有时候我们需要在Model中使用Session,大家知道CakePHP把操作Session的方法封装为了一个Component, 在Model中正常读取Session的方法: 在 "app_ ...

  3. STM32堆栈指针疑问

    1. 下面的代码看的不是很明白,百为stm32开发板光盘\测试程序\CortexM3\Mode_Privilege\project,堆是程序员分配和使用的,栈是编译器指定的,存放函数参数,临时变量. ...

  4. 移动onenet基础通信套件V1.08版本的AT指令测试

    1. 本次测试版本V1.08,AT+MIPLCREATE,首先需要一个配置文件.该指令创建一个基础通信套件的实例 2. 看下CGFID=2的配置,这个连接类型,UDP是1还是0?用户名和密码是什么?哪 ...

  5. Updating Homebrew... 长时间不动解决方法

    确保你已安装Homebrew 依次输入下面的命令(注意:不要管重置部分的命令,这里原作者贴出来.我也贴出来是以防需要重置的时候有参考操作命令) 替换brew.git: cd "$(brew ...

  6. ElasticSearch搜索引擎安装配置中文分词器IK插件

    近几篇ElasticSearch系列: 1.阿里云服务器Linux系统安装配置ElasticSearch搜索引擎 2.Linux系统中ElasticSearch搜索引擎安装配置Head插件 3.Ela ...

  7. 接口测试工具postman(五)批量执行测试用例

    1.准备好测试用例及相关数据 2.点击Run按钮 3.选择运行collection或者folder 4.运行完成

  8. Struts2(九.初始化用户列表时显示用户照片数目)

    1.userlist.jsp //显示每个用户照片的数目(遍历每个用户) $(".picture").each(function(i,e){ $.post("${page ...

  9. JAVA基础学习之路(二)方法定义,重载,递归

    一,方法的定义: package test; public class test1 { public static void main(String args[]) { int result = ad ...

  10. Stunnel客户端安装和配置

    声明:本文并非原创,转自华为云帮助中心的分布式缓存服务(DCS)的用户指南. 本文以公网访问华为云分布式缓存服务的Redis缓存为示例,介绍Stunnel客户端在各操作系统下的安装和配置. Stunn ...