题目: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 ;
}

51nod 1327 棋盘游戏——延迟决策的dp的更多相关文章

  1. 51Nod 1327 棋盘游戏 —— 延迟DP

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1327 看博客:https://www.cnblogs.com/Na ...

  2. [ 51Nod 1327 ] 棋盘游戏

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

  3. 51nod 1293 球与切换器 | DP

    51nod 1293 球与切换器 | DP 题面 有N行M列的正方形盒子.每个盒子有三种状态0, -1, +1.球从盒子上边或左边进入盒子,从下边或右边离开盒子.规则: 如果盒子的模式是-1,则进入它 ...

  4. 51Nod 1450 闯关游戏 —— 期望DP

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1450 期望DP: INF 表示这种情况不行,转移时把不行的概率也转 ...

  5. 51nod 1412 AVL树的种类(dp)

    题目链接:51nod 1412 AVL树的种类 开始做的时候把深度开得过小了结果一直WA,是我天真了.. #include<cstdio> #include<cstring> ...

  6. 51nod 1051 最大子矩阵和(dp)

    题目链接:51nod 1051 最大子矩阵和 实质是把最大子段和扩展到二维.读题注意m,n... #include<cstdio> #include<cstring> #inc ...

  7. BZOJ4426 :最大生产率(贪心+决策单调性DP)

    题意:给出N个人,现在让你分P组,每组的工作效率是最小结束时间-最大开始时间,要求每一组的效率的正数,求最大效率和.N<1000 思路: 把包含至少一个其他的分到A组:否则到B组. A组的要么单 ...

  8. CF321E Ciel and Gondolas 【决策单调性dp】

    题目链接 CF321E 题解 题意:将\(n\)个人分成\(K\)段,每段的人两两之间产生代价,求最小代价和 容易设\(f[k][i]\)表示前\(i\)个人分成\(k\)段的最小代价和 设\(val ...

  9. HYSBZ 1010 玩具装箱toy (决策单调DP)

    题意: 有n个玩具,要将它们分为若干组,玩具长度C可能不同.给出n个玩具的摆放顺序,连续的任意多个玩具都可以成为一组.区间[i,j]成为一组的费用是cost=(j-i+Sigma(Ck)-L)2且i& ...

随机推荐

  1. iOS UI08_tableView省市区字典数组

    北京 1 北京市 1 西城区 1 东城区 2 崇文区 3 宣武区 4 朝阳区 5 丰台区 6 石景山区 7 海淀区 8 门头沟区 9 房山区 10 通州区 11 顺义区 12 昌平区 13 大兴区 1 ...

  2. vue2.0 vue-router

    一.SPA中路由的简单实现 main.js import Vue from 'vue' import App from './App' import VueRouter from 'vue-route ...

  3. Odoo超售订单

    当 交付给客户的货物多于订购的数量时,就形成'超售'状态: 对于超售的部分,需要进行开票处理,以及根据情况修改交货     发生超售的前提是,产品开票策略为 '按订购数量开票'     同时需要 允许 ...

  4. Visual Studio 12无法调试Silverligh应用程序的问题

    环境: Win7 Ultimate X64 Visual Studio 12 (以下简称 VS12) Internet Explorer 9(以下简称 IE9) Silverlight5_x64 ad ...

  5. python(26)- 面向对象补充Ⅱ

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)判断obj是否是类 cls 的对象 class Foo(object): ...

  6. Ejb in action(六)——拦截器

    Ejb拦截器可以监听程序中的一个或全部方法.与Struts2中拦截器同名,并且他们都可以实现切面式服务.同一时候也与Spring中的AOP技术类似. 不同的是struts2的拦截器的实现原理是一层一层 ...

  7. 系统安全-LDAP

    LDAP服务器 1.目录服务  目录是一个为查询.浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好像Linux/Unix系统中的文件目录一样.目录数据库和关系数据库不同,它有优异的读性能 ...

  8. android lanchmode

    http://www.cnblogs.com/xiaoQLu/archive/2012/07/17/2595294.html http://www.cnblogs.com/lwbqqyumidi/p/ ...

  9. php CURL 模拟 POST 提交数据

    <?php function liansuo_post($url,$data){ // 模拟提交数据函数 $curl = curl_init(); // 启动一个CURL会话 curl_seto ...

  10. 在XP上安装VS2002

    在2002 年,随着 .NET 口号的提出与 Windows XP/Office XP 的公布,微软公布了 Visual Studio .NET(内部版本为 7.0). 使用VS2002+Object ...