【题解】51nod1327 棋盘游戏
那天和机房的同学们一起想了很久,然而并没有做出来……今天看了题解,的确比较巧妙,不过细细想来其实规律还是比较明显,在这里记录一下~
当天自己做的时候,主要想到的是两点 : 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 棋盘游戏的更多相关文章
- 题解-bzoj3901 棋盘游戏
2019年第一篇文章 (。・∀・)ノ゙ Problem bzoj无良权限题,拿学长的号交的 题目概要:给定一个\(n\times n\)的矩阵.令\(x=\frac {n+1}2\).可以进行任意次以 ...
- 51nod1327 棋盘游戏
远古大坑 神仙DP状态设计题 https://blog.csdn.net/white_elephant/article/details/83592103 从行的角度入手,无论如何都要状压 每列最多放一 ...
- 1358 棋盘游戏[状压dp]
1358 棋盘游戏 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description 这个游戏在一个有10*10 ...
- HDU1281: 棋盘游戏(二分图匹配)
棋盘游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- LOJ 一本通一句话题解系列:
第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...
- HDU1281 棋盘游戏 —— 二分图最大匹配 + 枚举
题目链接:https://vjudge.net/problem/HDU-1281 棋盘游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
随机推荐
- Python:pickle模块学习
1. pickle模块的作用 将字典.列表.字符串等对象进行持久化,存储到磁盘上,方便以后使用 2. pickle对象串行化 pickle模块将任意一个python对象转换成一系统字节的这个操作过程叫 ...
- 单例模式之pymysql运用实例
何为单例? 简单介绍一下下:单例是个什么鬼东西!!!! 单例模式含义] 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而 ...
- git 取消commit
git如何撤销上一次commit操作 1.第一种情况:还没有push,只是在本地commit git reset --soft|--mixed|--hard <commit_id> git ...
- jmeter开发自己的sampler插件
1. 新建maven工程 2.pom文件引入jmeter的核心包 <project xmlns="http://maven.apache.org/POM/4.0.0" xml ...
- JAVA日志框架概述
日志用来记录应用的运行状态以及一些关键业务信息,其重要性不言而喻,通常我们借助于现有的日志框架完成日志输出.目前开源的日志框架很多,常见的有log4j.logback等,有时候我们还会 ...
- 「LeetCode」0002-Longest Substring Without Repeating Characters(C++)
分析 贪心思想.注意更新每次判断的最长不同子串的左区间的时候,它是必须单调增的(有时候会在这里翻车). 代码 关掉流同步能有效提高速度. static const auto io_sync_off = ...
- MySQL☞abs函数
abs( )函数:求出绝对值 格式: select abs(数值) from 表名 如下图:
- MySQL☞in语句
in语句: 1)列名 in(数值1,数值2,数值3…):求出满足该列的多个列值 格式: select 列名1,列名2 from 表名 where 列名 in (数值1,数值2,数值3...) 如下图 ...
- web自动化原理揭秘
做过两年自动化测试的小伙伴说web自动化测试真的不难,无非就是一些浏览器操作,页面元素操作,常规的情况很容易处理,再学一学特殊元素的处理,基本就能应付项目的测试了. 这个话倒没错,但是真正要学好自动化 ...
- 【input】输入框组件说明
input输入框组件 原型: <input value="[String]" type="[text | number | idcard | digit]" ...