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

因为一列填1个或0个(或0个!!!),而一行不知填多少个,所以按列dp。

发现 l 和 r 的限制略有不同。大约是 l 如果先不填的话,在列向右移动的过程中可能就不能填了;而 r 一旦遇到,之后想什么时候填都可以。

所以可以记录空下了几列,遇到 l 的右边界时再处理该行,即从之前空下的列中选一个给该行;如果一下有多个 l 的右边界,乘上一个排列即可。

对于 r ,只要记录遇到过左边界的 r 里有多少个每填即可。

所以 dp[ i ][ j ][ k ] 表示第 i 列,空下 j 列,有 k 个遇到过的 r 没填的方案数。

注意一列可以不填!所以这一列不填或者填 l 这两种状态不要混起来,最好分开算。

注意不仅4个转移都要乘上选 l 的排列,它们自己都有自己的方案数!!!特别是这一列填 l 的时候,要乘 l [ i ] !!!!!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=,M=,mod=1e9+;
int n,m,l[M],r[M],dp[M][M][N],A[M][M],ans;
void Up(int &x,int y){x+=y;x>=mod?x-=mod:;}
void upd(int &x){x>=mod?x-=mod:;}
void init()
{
for(int i=;i<=m;i++)A[i][]=;
for(int i=;i<=m;i++)
for(int j=;j<=m;j++)
A[i][j]=A[i-][j-]+A[i-][j],upd(A[i][j]);
for(int j=,ml=;j<=m;j++)
{
ml=(ll)ml*j%mod;
for(int i=j;i<=m;i++)
A[i][j]=(ll)A[i][j]*ml%mod;
}
}
int main()
{
scanf("%d%d",&n,&m);init();
for(int i=,u,v;i<=n;i++)
{
scanf("%d%d",&u,&v);
l[u]++;r[m-v+]++;
}
dp[][][]=;
int yl=,rd=,yr=;
for(int i=;i<=m;i++)
{
rd+=l[i-]-r[i];
for(int j=max(,l[i]-);j<=i--yl;j++)
for(int k=;k<=yr;k++)
{
if(!dp[i][j][k])continue;
if(l[i])
Up(dp[i+][j-(l[i]-)][k+r[i]],(ll)dp[i][j][k]*A[j][l[i]-]%mod*l[i]%mod);
if(j>=l[i])
Up(dp[i+][j+-l[i]][k+r[i]],(ll)dp[i][j][k]*A[j][l[i]]%mod);
if(k+r[i]&&j>=l[i])
Up(dp[i+][j-l[i]][k+r[i]-],(ll)dp[i][j][k]*A[j][l[i]]%mod*(k+r[i])%mod);
if(rd&&j>=l[i])
Up(dp[i+][j-l[i]][k+r[i]],(ll)dp[i][j][k]*A[j][l[i]]%mod*rd%mod);
}
yl+=l[i];yr+=r[i];
}
for(int i=;i<=m;i++)ans+=dp[m+][i][],upd(ans);
printf("%d\n",ans);
return ;
}

最新文章

  1. 关于box-shadow属性的一点心得
  2. 安卓 JDK、SDK、ADT 区别
  3. Java基础-接口看下图实现如下接口和类,并完成Adventure中的主方法
  4. IOS 100 - 1 开工闲聊
  5. JSP动作标签
  6. Hibernate-Criteria Queries
  7. WPF学习06:转换控件内容为可存储图片
  8. Kali Linux 优化过程
  9. GCC 命令行详解 -L 指定库的路径 -l 指定需连接的库名(转载)
  10. Ext.getCmp()的简单使用
  11. MongoDBAuth
  12. System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt&quot;.
  13. JavaSE教程-03深入探究原码,反码,补码-扩展
  14. MS08_067漏洞学习研究
  15. linux tracepoint用法【转】
  16. AutoProject Studio 自动化项目生成器 下载地址
  17. Android Studio手动打包
  18. numpy 性能提升
  19. console call的fallback console 兼容
  20. 深入浅出MFC——Document-View深入探讨(五)

热门文章

  1. windows pipe
  2. Git 常用场景操作
  3. PS 如何使用钢笔工具
  4. 前言(CSDN也有Markdown了,好开森)
  5. ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开
  6. 基于Redis缓存的Session共享测试(转)
  7. Android添加系统级顶层窗口 和 WindowManager添加view的动画问题
  8. Django-中介模型
  9. 科学计算 | Matlab 使用 GPU 并行计算
  10. SqlServer,Oracle,Mysql 获取指定行数