远古大坑

神仙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 棋盘游戏的更多相关文章

  1. 【题解】51nod1327 棋盘游戏

    那天和机房的同学们一起想了很久,然而并没有做出来……今天看了题解,的确比较巧妙,不过细细想来其实规律还是比较明显,在这里记录一下~ 当天自己做的时候,主要想到的是两点 : 1.按列dp 2.对行进行排 ...

  2. HD1281棋盘游戏(匹配+好题)

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

  3. hdu------1281 棋盘游戏(最小覆盖点)

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

  4. hdu 1281 棋盘游戏

    http://acm.hdu.edu.cn/showproblem.php?pid=1281 棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  5. 洛谷P1117 棋盘游戏

    洛谷1117 棋盘游戏 题目描述 在一个4*4的棋盘上有8个黑棋和8个白棋,当且仅当两个格子有公共边,这两个格子上的棋是相邻的.移动棋子的规则是交换相邻两个棋子.现在给出一个初始棋盘和一个最终棋盘,要 ...

  6. UESTC_棋盘游戏 CDOJ 578

    最近昀昀学习到了一种新的棋盘游戏,这是一个在一个N×N的格子棋盘上去搞M个棋子的游戏,游戏的规则有下列几条: 棋盘上有且仅有一个出口 开始时没有哪个棋子在出口,而且所有棋子都不相邻(这里的相邻是指上下 ...

  7. Loj #2731 「JOISC 2016 Day 1」棋盘游戏

    Loj 2731 「JOISC 2016 Day 1」棋盘游戏 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少 ...

  8. Hdu1281 棋盘游戏

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

  9. HDOJ 1281 棋盘游戏

    拆点二分图匹配 棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot ...

随机推荐

  1. element-ui表格列金额显示两位小数

    对于金额的显示,大多情况下需要保留两位小数,比如下面的(表格采用 element-ui): 在vue.js中,对文本的处理通常是通过设置一系列的过滤器,过滤器可以用在两个地方:双花括号插值 和 v-b ...

  2. @codeforces - 1276F@ Asterisk Substrings

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个包含 n 个小写字母的字符串 s,用 s 生成 n 个串 ...

  3. python爬虫:一些爬虫常用的技巧

    1.基本抓取网页 get方法 import urllib2 url = "http://www.baidu.com" response = urllib2.urlopen(url) ...

  4. 【Leetcode堆和双端队列】滑动窗口最大值(239)

    题目 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 示例: 输入 ...

  5. 【JZOJ4824】【NOIP2016提高A组集训第1场10.29】配对游戏

    题目描述 流行的跳棋游戏是在一个有m*n个方格的长方形棋盘上玩的.棋盘起初全部被动物或障碍物占满了.在一个方格中,'X'表示一个障碍物,一个'0'-'9'的个位数字表示一个不同种类的动物,相同的个位数 ...

  6. 洛谷1758 BZOJ1566 管道取珠题解

    题目链接 一道人类智慧的dp题 首先我们可以将∑ai^2转化为求取两次,两次一样的方案数 然后用f[i][j][k][l]表示第一个人在第一个串中取到i第二个串中取到j 第二个人在一个串中取到k第二个 ...

  7. PHP笔试题(11道题)详解

    题目一 <?php echo -10%3; ?> 答案:-1. 考查:优先级. 因为-的优先级比%求余的优先级低, 也就是-(10%3). 2 题目二: print (int)pow(2, ...

  8. BKDRhash

     哈希: 字符串(数字同理): 例如有100000个字符串,现在要插入一些字符串,插入前比较是否已经存在避免含有重复数据 用暴力计较的话会比较慢,在某字符串插入时,最好的情况是在第一个位置就遇见该字符 ...

  9. [C#] 如何分析stackoverflow等clr错误

    有时候由于无限递归调用等代码错误,w3wp.exe会报错退出,原因是clr.exe出错了. 这种错误比较难分析,因为C#代码抓不住StackOverflowException等异常. 处理方法是:生成 ...

  10. jmeter日期处理beanshell(2)

    import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.text.P ...