【kAri OJ】621. 廖神的树
题目描述
廖神和男神在植树节的时候准备玩一个奇怪的游戏,他们现在有一个被分割成n*n个格子的矩形土地,他们现在准备往这个地里种树,但这个种树游戏必须满足以下两个要求:
1.每个格子只能是不种树(“0”)或种树(“1”)
2.每行和每列只能种两棵树
现在了不起的廖神种了之前的m行,他邀请男神种完剩下的树。可是男神很懒,这种事他一般都是交给学弟来做,那么聪明的你知道一共有多少种不同的填法吗?
输入格式
第一行是3个整数n,m,mod (2≤n≤500, 0≤m≤n, 2≤mod≤10^9).接下来的m行每行包含n个字符,每行有且仅有2个'1'表示已经种过树了,其余全为'0',表示没有种过树,而给出的每一列上至多有2个1,则廖神会使得他种过的树符合规定. 多组数据, 以EOF结束
输出格式
输出男神能够种果树的方案数 模mod的余数.
输入样例
3 1 1000
011
输出样例
2
分析
这个数据大小就要n2以内的时间复杂度,这样肯定不能搜索。前m行按要求种好了,现在要种的矩形土地里某些列不能种了,某些只能种一棵,剩下的必须种两棵。
我们一行行来种。每种一行,就会出现下面三种状态转移:
i表示能种一棵树的列数,j表示能种两棵树的列数。
1. 选择i列中的两列,i,j 变成 i-2,j。
2. 选择i列和j列的各一列,因为j的某列种了一棵树,这列就变成只能种一棵树的列,所以i,j变成 i,j-1。
3. 选择j中两列,i,j变成i+2,j-2。
dp[k][i][j]表示种完第k行,有i列能种一棵树,j列能种两棵树的方案数。那么就有
dp[k][i][j]+=dp[k-1][i+2][j]*C(i+2,2) 表示k-1行种好后,选择只能种一棵的i+2列里的两列。
dp[k][i][j]+=dp[k-1][i][j+1]*C(i,1)*C(j+1,1) 表示选择i列和j+1列中的各一列。
dp[k][i][j]+=dp[k-1][i-2][j+2]*C(j+2,2) 表示选择j+2列里的两列。
这样最后的dp[n][0][0]就是我们的答案了。
转移时,k在增大。
所以可以这样写循环:
for(k:m+1 to n)
for(j:0 to b)//j最大就是b了,不可能变大。
for(i: 0 to n)//为什么是n呢,因为如果先种j列中的列,那么i就在增大,可以大于a,最大到n。
{...}
能不能减少维数呢?
能种两棵的列往减小或相同的方向转移,即j+1、j+2、j转移到j。
且j相同时,i往小的方向转移,所以我们可以去掉代表第几行的那一维,然后循环这样写:
for(j:b downto 0)
for(i: n downto 0)
{...}
一开始dp[a][b](a列能种一棵树,b列能种两棵树。)=1。
代码
#include<cstdio>
#include<cstring>
#define N 550
#define ll long long
int dp[N][N];
int a,b,v[N];
int n,m,mod;
char s[N];
int main()
{
while(~scanf("%d%d%d",&n,&m,&mod))
{
memset(dp,,sizeof dp);
memset(v,,sizeof v);
b=n;
a=;
for(int i=; i<=m; i++)
{
scanf("%s",s);
for(int j=; j<n; j++)
if(s[j]=='')
{
v[j]++;
if(v[j]==)
a--;
else
{
b--;
a++;
}
}
}
dp[a][b]=;
for(int j=b; j>=; j--)
for(int i=n; i>=; i--)
if(i!=a||j!=b)
{
if(i>=)
dp[i][j]+=(ll)(j+)*(j+)/ *dp[i-][j+]%mod;
if(dp[i][j]>=mod)
dp[i][j]-=mod; dp[i][j]+=(ll)i*(j+)*dp[i][j+]%mod;
if(dp[i][j]>=mod)
dp[i][j]-=mod; dp[i][j]+=(ll)(i+)*(i+)/ *dp[i+][j]%mod;
if(dp[i][j]>=mod)
dp[i][j]-=mod;
}
printf("%d\n",dp[][]);
}
return ;
}
【kAri OJ】621. 廖神的树的更多相关文章
- 【kAri OJ 616】Asce的树
时间限制 1000 ms 内存限制 65536 KB 题目描述 作为一个东北大老爷们,大A熊以力气大著称,现在有一颗半径为r的树,剖面图如黑色的圆,大A熊决定搬几个半径为R的圆柱形桶将其围住,剖面图如 ...
- 【九度OJ】题目1176:树查找 解题报告
[九度OJ]题目1176:树查找 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1176 题目描述: 有一棵树,输出某一深度的所有节点 ...
- 【kAri OJ】wzt的树
时间限制 1000 ms 内存限制 65536 KB 题目描述 改革春风吹满地,中国人民真争气!家庭联产承包责任制以后,全国人民争想发家致富.wzt于是包了一个山头来种植金丝楠木,花了好几年种了N棵树 ...
- Light OJ 1114 Easily Readable 字典树
题目来源:Light OJ 1114 Easily Readable 题意:求一个句子有多少种组成方案 仅仅要满足每一个单词的首尾字符一样 中间顺序能够变化 思路:每一个单词除了首尾 中间的字符排序 ...
- 【kAri OJ605】陈队的树
时间限制 1000 ms 内存限制 65536 KB 题目描述 陈队有N棵树,有一天他突然想修剪一下这N棵树,他有M个修剪器,对于每个修剪器给出一个高度h,表示这个修剪器可以把某一棵高度超过h的树修剪 ...
- [Swust OJ 763]--校门外的树 Plus(暴力枚举)
题目链接:http://acm.swust.edu.cn/problem/0763/ Time limit(ms): 1000 Memory limit(kb): 65535 西南某科技大学的校门外有 ...
- SHU oj 422 风力观测 线段树
风力观测 发布时间: 2017年7月9日 18:17 最后更新: 2017年7月9日 21:04 时间限制: 1000ms 内存限制: 128M 描述 小Y正在观测y地区的风力情况,他在一 ...
- 【LOJ】#6391. 「THUPC2018」淘米神的树 / Tommy
题解 一道非常神仙的计数题 如果只有一个点,就是非常简单的树型dp \(f_{u} = (siz_{u} - 1)! \prod_{v \in son_{u}} \frac{f_{v}}{siz_{v ...
- 浴谷金秋线上集训营 T11738 伪神(树链剖分)
先树链剖分,一棵子树的编号在数组上连续,一条链用树链剖分,把这些线段全部取出来,做差分,找到有多少点被>=t条线段覆盖即可. #include<iostream> #include& ...
随机推荐
- UVALive 6656 Watching the Kangaroo --二分
题意:给你一些区间,再查询一些点,问这些点与所有区间形成的最小距离的最大值.最小距离定义为:如果点在区间内,那么最小距离为0,否则为min(pos-L[i],R[i]-pos). 解法:当然要排个序, ...
- Topcoder SRM 619 DIv2 500 --又是耻辱的一题
这题明明是一个简单的类似约瑟夫环的问题,但是由于细节问题迟迟不能得到正确结果,结果比赛完几分钟才改对..耻辱. 代码: #include <iostream> #include <c ...
- HDU 1698 & UESTC 1228 Just a hook
算是线段树中的一道水题了,必须用到懒操作,否则会超时.或者也可以刚开始不计算和,只更新节点,最后算整个线段的颜色和. 1.懒操作法 /* 908ms 3448KB in HDU OJ*/ #inclu ...
- C r and n(组合数)
找出n个数的r个数的组合,如下形式: 输入:n,r分别为 5, 3 输出: 5 4 3 5 4 2 5 4 1 5 3 2 5 3 ...
- Yii提供的Htmler助手checkboxList可自定义Checkbox输出格式
foreach($catetags as $cate){ echo Html::checkboxList('category_id','',$cate,['item'=>'customCheck ...
- window.lacation.replace
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- 我的WCF摸爬滚打之路(2)
昨天抽空写了一个wcf的创建和宿主程序的创建文章,下面也有很多园友给了评论,在此谢谢大家给了我继续记录我的摸爬滚打之路信心……抱拳! 上次的文章<我的WCF摸爬滚打之路(1)>中写到,在测 ...
- PHP基础14:表单处理
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- windows下git bash显示中文
1.C:\Program Files\Git\etc\git-completion.bash: alias ls='ls --show-control-chars --color=auto' 说明:使 ...
- ubuntu14.04上安装Mysql-5.7.11
先安装好操作系统 在Mysql官网上下载最新版的Ubuntu Linux专用的Mysql.我这里下载的是:mysql-server_5.7.11-1ubuntu14.04_amd64.deb-bu ...