题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1327

看博客:https://www.cnblogs.com/Narh/p/9791875.html

思路就是按列DP,如果不是必须填就先空下这一列,记录一下目前有多少可用的空列,遇到一个 l 的结束时就从中选一些列放上棋子,并乘个排列;

对于 r,方案数在当前列体现,所以要记录当前列可填的位置;

注意别漏了状态,当前可转移的状态是填 l,填 r,不填,填在不是 l 也不是 r 的地方四种转移;

还有各种细节...全仰仗 Narh 提点;

呆滞了半小时...一对拍就发现...在算 A 的地方别忘了写 (ll) !!!

好题啊!

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const xn=,xm=,mod=1e9+;
int n,m,l[xn],r[xn],f[xm][xm][xm],jc[xm],jcn[xm],sl[xm],sr[xm];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return f?ret:-ret;
}
ll pw(ll a,int b)
{
ll ret=;
for(;b;b>>=,a=(a*a)%mod)
if(b&)ret=(ret*a)%mod;
return ret;
}
void init()
{
jc[]=;
for(int i=;i<=m;i++)jc[i]=((ll)jc[i-]*i)%mod;
jcn[m]=pw(jc[m],mod-);
for(int i=m-;i>=;i--)jcn[i]=((ll)jcn[i+]*(i+))%mod;
}
int A(int n,int m){return (ll)jc[n]*jcn[n-m]%mod;}//(ll)!!!
void upt(int &x,int y){x+=y; while(x>=mod)x-=mod; while(x<)x+=mod;}
int main()
{
n=rd(); m=rd(); init();
for(int i=;i<=n;i++)l[i]=rd(),r[i]=rd(),sl[l[i]]++,sr[m-r[i]+]++;
for(int i=;i<=m;i++)sr[i]+=sr[i-];
f[][][]=;
for(int i=,num=;i<m;i++,num=num+sl[i])//列
for(int j=max(,sl[i+]-);j<=i-num;j++)//剩余
for(int k=;k<=min(i,n);k++)//填r
{
if(!f[i][j][k])continue;
if(sl[i+])
upt(f[i+][j+-sl[i+]][k],(ll)f[i][j][k]*A(j+,sl[i+])%mod);
//,printf("f[%d][%d][%d]=%d A(%d,%d)=%lld f[%d][%d][%d]=%d\n",i,j,k,f[i][j][k],j+1,sl[i+1],A(j+1,sl[i+1]),i+1,j+1-sl[i+1],k,f[i+1][j+1-sl[i+1]][k]);//l
else upt(f[i+][j+][k],f[i][j][k]);//
if(sr[i+]>k&&j>=sl[i+])
upt(f[i+][j-sl[i+]][k+],(ll)f[i][j][k]*A(j,sl[i+])%mod*(sr[i+]-k)%mod);
//,printf("sr=%d k=%d f[%d][%d][%d]=%d f[%d][%d][%d]=%d\n",sr[i+1],k,i,j,k,f[i][j][k],i+1,j-sl[i+1],k+1,f[i+1][j-sl[i+1]][k+1]);//r(+l)
if(num-sr[i+]&&j>=sl[i+])
upt(f[i+][j-sl[i+]][k],(ll)f[i][j][k]*A(j,sl[i+])%mod*(num-sr[i+])%mod);
//,printf("!l!r:f[%d][%d][%d]=%d A=%lld k=%d f[%d][%d][%d]=%d\n",i,j,k,f[i][j][k],A(j,sl[i+1]),num-sr[i+1],i+1,j-sl[i+1],k,f[i+1][j-sl[i+1]][k]);//!l,!r (+l)
// printf("f[%d][%d][%d]=%d\n",i,j,k,f[i][j][k]);
}
int ans=;
for(int j=;j<=m-*n;j++)upt(ans,f[m][j][n]);
//,printf("f[%d][%d][%d]=%d\n",m,j,n,f[m][j][n]);
printf("%d\n",ans);
return ;
}

51Nod 1327 棋盘游戏 —— 延迟DP的更多相关文章

  1. 51nod 1327 棋盘游戏——延迟决策的dp

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1327 因为一列填1个或0个(或0个!!!),而一行不知填多少个,所 ...

  2. [ 51Nod 1327 ] 棋盘游戏

    \(\\\) \(Description\) 给出一张\(N\times M\)的棋盘,每个格子最多放置一个棋子,一个合法的放置方案需满足: 每列至多放置一个棋子 对于第\(i\)行,前\(L_i\) ...

  3. 51nod 1353 树 | 树形DP经典题!

    51nod 1353 树 | 树形DP好题! 题面 切断一棵树的任意条边,这棵树会变成一棵森林. 现要求森林中每棵树的节点个数不小于k,求有多少种切法. 数据范围:\(n \le 2000\). 题解 ...

  4. 51nod 1636 教育改革 | DP

    51nod 1636 教育改革 | DP 题面 最近A学校正在实施教育改革. 一个学年由n天组成.A学校有m门课程,每天学生必须学习一门课,一门课程必须在一天内学习完.在学习完第i门课程后,学生们会收 ...

  5. 51nod 1021 石子归并(dp)

    51nod 1021 石子归并 题解:从i到j合并的最小值:dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + sum[j] - sum[i-1]); 最 ...

  6. 51nod 1183 - 编辑距离 - [简单DP][编辑距离问题][Levenshtein距离问题]

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 编辑距离,又称Levenshtein距离(也叫做Edi ...

  7. 51nod 1406 位运算/dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1406 1406 与查询 题目来源: CodeForces 基准时间限制: ...

  8. 51NOD 1202 子序列个数 DP

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1202&judgeId=225600 这题看起来挺复杂,但是真正的 ...

  9. 51nod 1201 整数划分 dp

    1201 整数划分 基准时间限制:1 秒 空间限制:131072 KB   收藏  关注 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2,4} {1,2 ...

随机推荐

  1. 临远的spring security教程

    为啥选择Spring Security 欢迎阅读咱们写的Spring Security教程,咱们既不想写一个简单的入门教程,也不想翻译已有的国外教程.咱们这个教程就是建立在咱们自己做的OA的基础上,一 ...

  2. QML 开发神奇加成之为网络资源设置本地缓存

    QML 开发神奇加成之为网络资源设置本地缓存 直接上码: #include <QNetworkAccessManager> #include <QNetworkDiskCache&g ...

  3. iOS开发 下滑隐藏Tabbar

    项目中用到下滑隐藏tabbar,上滑显示.      虽然实现起来非常简单,还是记录一下. -(void)scrollViewDidScroll:(UIScrollView*)scrollView { ...

  4. Mecanim动画编辑器 - 加入动画层实现并行动作

    1.创建新的状态层 a) 通过下图的1button创建一个新的层   b) 通过下图2属性设置图层的权重.假设为0,则该图层的状态不会影响到总的状态机  c) Mask是设置动画的Avatar的关联节 ...

  5. centos 7 -- Disk Requirements: At least 134MB more space needed on the / filesystem.

    用了幾年的centos7,今天執行yum update時,彈出一行有錯誤的提示:Disk Requirements:   At least 134MB more space needed on the ...

  6. XStream 数组(List)输出结构

    <!-- 期望的DOM树 --> <Articles> <item> <Title>微信SDK初步结构</Title> <Descri ...

  7. vue 安装与起步

    vue安装: 1.官网下载vue,在script标签里引用(去下载) 2.使用CDN(建议下载到本地,不推荐这种方法): BootCDN:https://cdn.bootcss.com/vue/2.2 ...

  8. sendmessage传递数组

    1.在初始化数组尤其是需要每次都初始化的时候,很多同学使用循环来进行,这样不但速度慢,而且写起来也很长.所以现在提供一个函数来实现这个功能... 原型:extern void *memset(void ...

  9. SD_WebImage之相同url图片不更新问题

    最近做项目,服务器返回的头像url雷打不动的不变,命名方式是用户id与日期的组合,与后台沟通无果,于是把sdwebimage看了一圈后发现了这个选项,它的原理是如果沙盒中有相同的url,则会把原来的删 ...

  10. 4408: [Fjoi 2016]神秘数

    4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 452  Solved: 273 [Submit][Stat ...