51Nod 1327 棋盘游戏 —— 延迟DP
题目: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的更多相关文章
- 51nod 1327 棋盘游戏——延迟决策的dp
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1327 因为一列填1个或0个(或0个!!!),而一行不知填多少个,所 ...
- [ 51Nod 1327 ] 棋盘游戏
\(\\\) \(Description\) 给出一张\(N\times M\)的棋盘,每个格子最多放置一个棋子,一个合法的放置方案需满足: 每列至多放置一个棋子 对于第\(i\)行,前\(L_i\) ...
- 51nod 1353 树 | 树形DP经典题!
51nod 1353 树 | 树形DP好题! 题面 切断一棵树的任意条边,这棵树会变成一棵森林. 现要求森林中每棵树的节点个数不小于k,求有多少种切法. 数据范围:\(n \le 2000\). 题解 ...
- 51nod 1636 教育改革 | DP
51nod 1636 教育改革 | DP 题面 最近A学校正在实施教育改革. 一个学年由n天组成.A学校有m门课程,每天学生必须学习一门课,一门课程必须在一天内学习完.在学习完第i门课程后,学生们会收 ...
- 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]); 最 ...
- 51nod 1183 - 编辑距离 - [简单DP][编辑距离问题][Levenshtein距离问题]
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 编辑距离,又称Levenshtein距离(也叫做Edi ...
- 51nod 1406 位运算/dp
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1406 1406 与查询 题目来源: CodeForces 基准时间限制: ...
- 51NOD 1202 子序列个数 DP
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1202&judgeId=225600 这题看起来挺复杂,但是真正的 ...
- 51nod 1201 整数划分 dp
1201 整数划分 基准时间限制:1 秒 空间限制:131072 KB 收藏 关注 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2,4} {1,2 ...
随机推荐
- windows安装RabbitMQ注意事项
1.首先下载好ERLANG.RabbitMQ安装包,先安装erlang,设置好环境变量,然后再去安装MQ; 2.别人有两个报错: 一:RabbitMQ安装目录中不允许有空格; 二:安装rabbitmq ...
- 基于SSH+shiro+solr的家庭记账系统
项目地址: https://github.com/jianghuxiaoao/homeaccount
- 在matlab中对中国地图中的不同省份按照高度进行渲染
直接上优化后的代码和效果图 colour_totall=128; % 载入地图数据 --各省的多边形数据 shp_data=shaperead('maps/bou2_4p.shp', 'UseGeoC ...
- Andrew Ng的机器学习视频文件夹(from coursera, 2014)
第一周: 简单介绍机器学习,有监督学习.无监督学习. 1-1,1-2,1-3,1-4 第二周: 2-1:回归问题举例 2-2:介绍cost function定义. 2-3:在回归函数是一个经过原点的直 ...
- jQuery的ajax,当async为false时,同步操作失败。解决方式
引发失败时代码: $.ajax({ url : 'your url', data:{name:value}, cache : false, async : true, type : "POS ...
- Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为
三.资源管理 资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket ...
- zookeeper 服务端上下线,客户端感知
package pfs.y2017.m11.zookeeper.demo03; import java.util.ArrayList; import java.util.List; import or ...
- [LightOJ 1018]Brush (IV)[状压DP]
题目链接:http://lightoj.com/volume_showproblem.php? problem=1018 题意分析:平面上有不超过N个点,如今能够随意方向划直线将它们划去,问:最少要划 ...
- openwrt gstreamer实例学习笔记(七. gstreamer 缓冲区(Buffers)和事件(Events))
1)概述 管道的数据流由一组缓冲区和事件组成,缓冲区包括实际的管道数据,事件包括控制信息,如寻找信息和流的终止信号.所有这些数据流在运行的时候自动的流过管道. 2) 缓冲区(Buffers) 缓冲区包 ...
- NPOI实现Excel导入
导入功能实现: ]; GetExtensionsFromFileStream(file.InputStream); using NPOI.XSSF.UserModel; public List< ...