51nod 1327 棋盘游戏——延迟决策的dp
题目: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的更多相关文章
- 51Nod 1327 棋盘游戏 —— 延迟DP
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1327 看博客:https://www.cnblogs.com/Na ...
- [ 51Nod 1327 ] 棋盘游戏
\(\\\) \(Description\) 给出一张\(N\times M\)的棋盘,每个格子最多放置一个棋子,一个合法的放置方案需满足: 每列至多放置一个棋子 对于第\(i\)行,前\(L_i\) ...
- 51nod 1293 球与切换器 | DP
51nod 1293 球与切换器 | DP 题面 有N行M列的正方形盒子.每个盒子有三种状态0, -1, +1.球从盒子上边或左边进入盒子,从下边或右边离开盒子.规则: 如果盒子的模式是-1,则进入它 ...
- 51Nod 1450 闯关游戏 —— 期望DP
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1450 期望DP: INF 表示这种情况不行,转移时把不行的概率也转 ...
- 51nod 1412 AVL树的种类(dp)
题目链接:51nod 1412 AVL树的种类 开始做的时候把深度开得过小了结果一直WA,是我天真了.. #include<cstdio> #include<cstring> ...
- 51nod 1051 最大子矩阵和(dp)
题目链接:51nod 1051 最大子矩阵和 实质是把最大子段和扩展到二维.读题注意m,n... #include<cstdio> #include<cstring> #inc ...
- BZOJ4426 :最大生产率(贪心+决策单调性DP)
题意:给出N个人,现在让你分P组,每组的工作效率是最小结束时间-最大开始时间,要求每一组的效率的正数,求最大效率和.N<1000 思路: 把包含至少一个其他的分到A组:否则到B组. A组的要么单 ...
- CF321E Ciel and Gondolas 【决策单调性dp】
题目链接 CF321E 题解 题意:将\(n\)个人分成\(K\)段,每段的人两两之间产生代价,求最小代价和 容易设\(f[k][i]\)表示前\(i\)个人分成\(k\)段的最小代价和 设\(val ...
- HYSBZ 1010 玩具装箱toy (决策单调DP)
题意: 有n个玩具,要将它们分为若干组,玩具长度C可能不同.给出n个玩具的摆放顺序,连续的任意多个玩具都可以成为一组.区间[i,j]成为一组的费用是cost=(j-i+Sigma(Ck)-L)2且i& ...
随机推荐
- Java中char转为16进制
Java中char转为16进制 char a = '0'; String hexStr = Integer.toHexString(a); System.out.println(hexStr);
- table 设置边框
本文引自:https://www.cnblogs.com/leona-d/p/6125896.html 示例代码: <!DOCTYPE html> <html lang=" ...
- Effective Go(官方文档)笔记
Effective Go(官方文档)笔记 自己主动局部变量提升(编译期完毕?):return &...; 内置函数: new/make copy, append delete range(这是 ...
- Flex4_Tree组件2(添加多选框、修改树图标)
1.新建AS类,用于为Tree生成复选框,及一些选择事件. package com.th.myUtils { import flash.events.Event; import flash.event ...
- 介绍一个开源的SIP(VOIP)协议库PJSIP
本文系转载,出处不可考. 假设你对SIP/VoIP技术感兴趣,哪希望你不要错过:),假设你对写出堪称优美的Code感兴趣 ,那么你也不可错过:) 这期间我想分析一下一个实际的协议栈的设计到实现的相关技 ...
- python(34)- 模块与包练习
创建如下目录结构 keystone/ ├── __init__.py └── auth ├── __init__.py └── plugins └── core.py ...
- viewState详解
作者:Infinities Loop 概述 ViewState是一个被误解很深的动物了.我希望通过此文章来澄清人们对 ViewState的一些错误认识.为了达到这个目的,我决定从头到尾详细的描述一下整 ...
- caffe搭建--缺少 skimage-缺少 google.protobuf.internal.-caffe搭建--ipython--ubuntu16.04+ caffe+ ipython
mkdir build && cd build cmake .. make pycaffe -j4 sudo vim /etc/profile---- export PYTHONPAT ...
- PE添加Style
1. <style id="NumberStyle"> <setting> <param name="option"> ...
- poi 处理excel 小数问题 整数不保留小数位 整数多.0
读取的单元格为 hssfCell ,传入下面我提供的方法处理默认poi返回的为DOUBLE,所有先转为Long判断下,再进行返回: private String getValue(Cell hssfC ...