首页 > 其他分享 >51nod 1327 棋盘游戏

51nod 1327 棋盘游戏

时间:2023-04-04 12:03:46浏览次数:46  
标签:1327 格子 51nod 000 棋子 棋盘 dp mod



1327 棋盘游戏



题目来源:  TopCoder



基准时间限制:1 秒 空间限制:131072 KB 分值: 640  难度:8级算法题





 收藏



 关注

有一个N行M列的棋盘,即该棋盘被分为N*M格。现在向棋盘中放棋子,每个格子中最多放一个棋子,也可以一个不放。放完棋子后需要满足如下要求:


1)对于第i行来说,其从左往右的前left[i] 个格子(即最左侧的left[i] 个连续的格子)中恰好一共有1个棋子;


2)对于第i行来说,其从右往左的前right[i]个格子(即最右侧的right[i]个连续的格子)中恰好一共有1个棋子;


3)对于每一列来说,这一列上的所有格子内含有的棋子数不得超过1个。


其中,1)与2)条件中,对所有 i 满足 left[i]+right[i] <= M,即两个区间不会相交。


问,符合上述条件情况下棋子的不同放法一共有多少种?输出放法的个数 mod  1,000,000,007后的结果。



例如样例中,只有如下图一种方法。


           



Input


第一行包含两个整数,N,M,其中1<=N<=50,2<=M<=200.之后有N行,每行两个数left[i],right[i],其中,1<=left[i],right[i]<=M,且 left[i]+right[i] <= M。


Output


一个整数,即符合条件的方案数mod 1,000,000,007后的结果。


Input示例


2 41 22 1


Output示例


1





【分析】

奇葩dp

去看别的宝宝的讲解吧...




【代码】

//51nod 1327 棋盘游戏 
#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
const int mxn=205;
const int mod=1e9+7;
int n,m,T,lef,rig,ans;
int L[mxn],R[mxn],p[mxn];
ll fac[mxn],C[mxn][mxn],dp[mxn][mxn][mxn];
inline void init()
{
	fac[0]=1;fo(i,0,200) C[i][0]=1;
	fo(i,1,200) fac[i]=fac[i-1]*i%mod;
	fo(i,1,200) fo(j,1,200) C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
}
int main()
{
	init();
	scanf("%d%d",&n,&m);
	fo(i,1,n)
	{
		scanf("%d%d",&lef,&rig);
		L[lef]++,R[m-rig+1]++;
		fo(j,lef+1,m-rig) p[j]++;
	}
	dp[0][0][0]=1;
	fo(i,0,m)
	  fo(j,0,m)
	    fo(k,0,n) if(dp[i][j][k] && k+R[i+1]<=n)
	    {
	    	if(j-L[i+1]+1>=0)
	    	  (dp[i+1][j-L[i+1]+1][k+R[i+1]]+=dp[i][j][k]*C[j+1][L[i+1]]%mod*fac[L[i+1]]%mod)%=mod;
			if(j-L[i+1]>=0)
			  (dp[i+1][j-L[i+1]][k+R[i+1]]+=dp[i][j][k]*p[i+1]%mod*C[j][L[i+1]]%mod*fac[L[i+1]]%mod)%=mod;
			if(j-L[i+1]>=0 && k+R[i+1]>0)
			  (dp[i+1][j-L[i+1]][k+R[i+1]-1]+=dp[i][j][k]*(k+R[i+1])%mod*C[j][L[i+1]]%mod*fac[L[i+1]]%mod)%=mod;
	    }
	fo(i,0,m) ans=(ans+dp[m][i][0])%mod;
	printf("%d\n",ans);
	return 0;
}



标签:1327,格子,51nod,000,棋子,棋盘,dp,mod
From: https://blog.51cto.com/u_15967757/6168366

相关文章

  • 51nod 1055 最长等差数列
    1055 最长等差数列基准时间限制:2 秒空间限制:262144 KB分值: 80 难度:5级算法题 收藏 关注例如:13568910121314等差子数列包括(仅包括两项的不列举)1351591336912......
  • 51nod 1799 二分答案
    1799二分答案基准时间限制:1秒空间限制:131072KB分值:40难度:4级算法题收藏关注lyk最近在研究二分答案类的问题。对于一个有n个互不相同的数且从小到大的正整数数列a(其中最大值不超过n),若要找一个在a中出现过的数字m,一个正确的二分程序是这样子的:l=1;r=n;mid=(l+r)/......
  • 51nod 1551 集合交易
    1551 集合交易题目来源: CodeForces基准时间限制:1 秒空间限制:131072 KB分值: 320 难度:7级算法题 收藏 关注市场中有n个集合在卖。我们想买到满足以下要求的一些集合,所买到集合的个数要等于所有买到的集合合并后的元素的个数......
  • 51nod 1370 排列与操作
    1370 排列与操作题目来源: TopCoder基准时间限制:2 秒空间限制:131072 KB分值: 320 难度:7级算法题 收藏 关注给定N长排列P,其中排列指数集{1,2,3...N}组成的一个序列,序列中每个元素恰好出现一次。初始时这个排列是给出的。之......
  • 51nod 1486 大大走格子
    1486 大大走格子题目来源: CodeForces基准时间限制:1 秒空间限制:131072 KB分值: 160 难度:6级算法题 收藏 关注有一个h行w列的棋盘,里面有一些格子是不能走的,现在要求从左上角走到右下角的方案数。Input单组测试数据......
  • 51nod 1149 Pi的递推式
    1149 Pi的递推式基准时间限制:1 秒空间限制:131072 KB分值: 640 难度:8级算法题 收藏 关注F(x)=1(0<=x<4)F(x)=F(x-1)+F(x-pi)(4<=x)Pi=3.1415926535.....现在给出一个N,求F(N)。由于结果巨......
  • 方格棋盘
    题目描述在n*n(n≤20)的方格棋盘上放置n个车,每个车可以攻击到所在行和列任意一个格,求使它们不能互相攻击的方案总数。输入格式一个数n输出格式方案总数#include<ios......
  • 0001-算法笔记分治法实现棋盘覆盖问题
    今天上课老师讲了分治法,下课后自己把程序碼了一遍,还是存在一个疑问--为什么每个方格都会填充到,在下面将会解决并叙述。    首先贴上程序:#include<stdio.h>#incl......
  • P5752 [NOI1999] 棋盘分割题解
    本文来自我的洛谷博客。本题解力求使用清晰易懂的图片和文字,讲解最简洁的道理。请大家耐心地看完,注意要结合图片一起哦~~2022-8-24更改了格式与错别字2022-8-28更改......
  • 51Nod1019 逆序数(归并排序详解)
    逆序对给定一个1-N的排列A1,A2,...AN,如果Ai和Aj满足i<j且Ai>Aj,我们就称(Ai,Aj)是一个逆序对。 求A1,A2...AN中所有逆序对的数目。input 第一行包含一个整数N......