51nod1327 棋盘游戏
远古大坑
神仙DP状态设计题
https://blog.csdn.net/white_elephant/article/details/83592103
从行的角度入手,无论如何都要状压
每列最多放一个,所以从列的角度入手
每列会左端点结束,右端点出现,以及空位
个数设为:l[i],r[i],md[i]
直接决定当前列填在哪一行很困难,若直接记录还有多少行左半边没有填,那么并不知道哪些行的左半边之后会消失,无法转移
所以在这个左半边消失的时刻进行安排位置!
只要考虑之前预留了多少列即可,这些列都是可以用的
右半边?
预留就不行了,因为“起点”不一样,不一定都能用
但是终点一样,这次没有填的右部分,下一列还是可以填,所以直接转移
状态:f[i][j][k]“填完前i列,还有j列是空的,右半部分还有k行左端点出现在i及之前,且没有放置”的方案数
转移枚举填什么即可

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');} namespace Miracle{
const int N=;
const int M=;
const int mod=1e9+;
int A[M][M];
int jie[M];
int n,m,f[M][M][N];
int l[M],r[M],md[M];
int ad(int x,int y){
return (x+y)>=mod?x+y-mod:x+y;
}
void inc(int &x,int y){
x=ad(x,y);
}
int mul(int x,int y){
return (ll)x*y%mod;
}
int main(){
rd(n);rd(m);
if(*n>m){
puts("");return ;
}
jie[]=;
for(reg i=;i<=m;++i) jie[i]=(ll)jie[i-]*i%mod;
A[][]=;
for(reg i=;i<=m;++i){
A[i][]=;
for(reg j=;j<=i;++j){
A[i][j]=ad(A[i-][j],A[i-][j-]);
}
}
for(reg i=;i<=m;++i){
for(reg j=;j<=i;++j){
A[i][j]=(ll)A[i][j]*jie[j]%mod;
}
}
for(reg i=;i<=n;++i){
int L,R;rd(L);rd(R);
R=m-R+;
++l[L];++r[R];
for(reg j=L+;j<R;++j){
++md[j];
}
}
f[][][]=;
for(reg i=;i<m;++i){
for(reg j=;j<=i;++j){
for(reg k=;k<=n;++k){
int lp=f[i][j][k];
if(lp){
if(j+-l[i+]>=) inc(f[i+][j+-l[i+]][k+r[i+]],mul(lp,A[j+][l[i+]]));
if(j-l[i+]>=&&k+r[i+]>) inc(f[i+][j-l[i+]][k+r[i+]-],mul(lp,mul(A[j][l[i+]],k+r[i+])));
if(j-l[i+]>=) inc(f[i+][j-l[i+]][k+r[i+]],mul(lp,mul(A[j][l[i+]],md[i+])));
}
}
}
}
ll ans=;
for(reg j=;j<=m;++j) ans=ad(ans,f[m][j][]);
ot(ans);
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
*/
考虑从列入手简单
但是直接记录剩下多少个没填很难,因为结束位置不同
所以考虑在最后结束位置进行分配,只要记录之前剩下多少
一种变相的对未来承诺,或者说是预留
51nod1327 棋盘游戏的更多相关文章
- 【题解】51nod1327 棋盘游戏
那天和机房的同学们一起想了很久,然而并没有做出来……今天看了题解,的确比较巧妙,不过细细想来其实规律还是比较明显,在这里记录一下~ 当天自己做的时候,主要想到的是两点 : 1.按列dp 2.对行进行排 ...
- HD1281棋盘游戏(匹配+好题)
棋盘游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu------1281 棋盘游戏(最小覆盖点)
棋盘游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 1281 棋盘游戏
http://acm.hdu.edu.cn/showproblem.php?pid=1281 棋盘游戏 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- 洛谷P1117 棋盘游戏
洛谷1117 棋盘游戏 题目描述 在一个4*4的棋盘上有8个黑棋和8个白棋,当且仅当两个格子有公共边,这两个格子上的棋是相邻的.移动棋子的规则是交换相邻两个棋子.现在给出一个初始棋盘和一个最终棋盘,要 ...
- UESTC_棋盘游戏 CDOJ 578
最近昀昀学习到了一种新的棋盘游戏,这是一个在一个N×N的格子棋盘上去搞M个棋子的游戏,游戏的规则有下列几条: 棋盘上有且仅有一个出口 开始时没有哪个棋子在出口,而且所有棋子都不相邻(这里的相邻是指上下 ...
- Loj #2731 「JOISC 2016 Day 1」棋盘游戏
Loj 2731 「JOISC 2016 Day 1」棋盘游戏 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少 ...
- Hdu1281 棋盘游戏
棋盘游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDOJ 1281 棋盘游戏
拆点二分图匹配 棋盘游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...
随机推荐
- Leetcode704.Binary Search二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: num ...
- 如何在Liferay 7中用html显示页面
liferay portlet默认的显示页面是view.jsp,虽然可以在jsp中用include标签包括html文件,但是如何直接通过修改配置文件让默认的显示页面为view.html呢? 1.用Li ...
- 廖雪峰Python总结1
1.输入输出 输入? 2.文本编辑器中,需要把Tab键自动转换为四个空格,确保不混用Tab和空格. 3.数据类型和变量 1.整数和浮点数在计算机内部存储的方式是不同的,整数运算永远是精确的(包括除法) ...
- Linux常用命令4 帮助命令
1.帮助命令:man 命令英文原意:manual 命令所在路径:/usr/bin/man 执行权限:所有用户 语法:man [命令或配置文件] 功能描述:获得命令或者配置文件的帮助信息 例如:m ...
- jquery find 推荐
https://codeplayer.vip/p/j7soa 这篇写的还是不错的,备用. // 返回jQuery对象所有匹配元素的标识信息数组 // 每个元素形如:tagName或tagName#id ...
- day4_python之三元表达式、列表推导式、生成器表达式
一.三元表达式 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(res) 二.列表解析 l = [] for ...
- APP上线前,如何做运营推广工作?
http://www.cocoachina.com/market/20150723/12731.html 一 竞品分析 1.选择竞品,做好定位(选择两个产品最好,最多三个). 如何获取竞品? A 百度 ...
- Person Re-identification 系列论文笔记(三):Improving Person Re-identification by Attribute and Identity Learning
Improving Person Re-identification by Attribute and Identity Learning Lin Y, Zheng L, Zheng Z, et al ...
- 【机器学习】Iris Data Set(鸢尾花数据集)
[机器学习]Iris Data Set(鸢尾花数据集) 注:数据是机器学习模型的原材料,当下机器学习的热潮离不开大数据的支撑.在机器学习领域,有大量的公开数据集可以使用,从几百个样本到几十万个样本的数 ...
- Atcoder Tenka1 Programmer Contest C C - 4/N
http://tenka1-2017.contest.atcoder.jp/tasks/tenka1_2017_c 我怀疑我是不是智障.... 本来一直的想法是能不能构造出答案,把N按奇偶分,偶数好办 ...