xdoj-1117(记忆化搜索+组合数学)
因为我是从上到下,所以就不叫动态规划而叫记忆化搜索吧
(不过运行时间只有3ms....应该是很不错的吧)
排版怎么那么难看。。。编辑的时候不是这样子的啊?!
思想 : 大眼一看应该是一道很裸的状压dp; 状态为填完每一列 每行%2的值 ; 状态的改变用异或就可以啦
我不是很会状压。。。有一个想法------状态是无序的 【我们只需要两个值】
k0(0的个数),k1(1的个数)来描述状态就可以啦。。
1)状态描述:f[x][k0][k1] 在【1~(x-1)】列填好基础上填满整个方格
要求填满方格之后 每行panda个数(从x列开始)%2==0个数为k0 ; ==1个数为k1
2) 状态转移:每列要求填a[i]个,a[i]个怎么分配呢?
要求为0的方格填k个,要求为1的方格填a[i]-k;
//状态转移
LL ans=;
for (int i=;i<=a[t];i++) {//有i个数放在了0的位置
if ( i<=k0 ) {
int t1=k0-i*+a[t]; //t1=k0-i+a[i]-0 0填一个表情变成1 1填一个变成0
int t2=k1+*i-a[t];
if (f[t+][t1][t2]<) //记忆化搜索
f[t+][t1][t2]=dfs (t1,t2,t+,sum-a[t]);
ans=( ans+C(k0,i)*C(k1,a[t]-i)%mod*f[t+][t1][t2]%mod )%mod;// c(k0,i)--》 从k0个位置选i个位置
}
}
3) 有个小优化的彩蛋哦。。。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=+;
const int mod=1e9+;
int a[N];
int n,m;
int cnt;
LL f[][][];
LL b[][];
LL C (int x, int y) {
if (y==) return ;
if (x-y<y) y=x-y;
if (b[x][y]) return b[x][y];
LL sum=;
LL k=;
for (int i=x-y+;i<=x;i++)
sum=sum*i/(k++);
b[x][y]=sum;
return sum;
}
LL dfs (int k0,int k1,int t,int sum) {
if (t==m) {
if (k1==a[t]) return ;
return ;
}
if (sum%!=k1%) return ;// 优化。。想想为什么呢?!
LL ans=;
for (int i=;i<=a[t];i++) {
if ( i<=k0 ) {
int t1=k0-i*+a[t];
int t2=k1+*i-a[t];
if (f[t+][t1][t2]<)
f[t+][t1][t2]=dfs (t1,t2,t+,sum-a[t]);
ans=( ans+C(k0,i)*C(k1,a[t]-i)%mod*f[t+][t1][t2]%mod )%mod;
}
}
return ans;
}
int main ()
{
while (~scanf ("%d %d",&n,&m)) {
int k0,k1;
memset (f,-,sizeof(f));
k1=k0=;
int sum=;
for (int i=;i<=m;i++) {
scanf ("%d",&a[i]);
sum+=a[i];
}
for (int i=;i<=n;i++) {
int x; scanf ("%d",&x);
if (x) k1++;
else k0++;
}
LL ans=dfs (k0,k1,,sum);
printf ("%lld\n",ans);
}
return ;
}
1117: Insert Orz Pandas
时间限制: 2 Sec 内存限制: 128 MB
提交: 32 解决: 12
[提交][状态][讨论版]
题目描述
Orz panda emotion is a famous emotion in XDU/ACM-ICPC QQ groups.
Big Big Xi loves to create new Orz panda emotions.
Now he has a matrix with n lines and m columns,form n*m cells.
And he wants to insert some small Orz pandas to this matrix to create a big emotion.
In each cell of the matrix,he will determine whether put a small Orz panda or not.
For some reasons,he has some special needs of the emotions:
1.In the ith column,there must be a[i] small Orz pandas. (1<=i<=m)
2.In the ith line,assume the total number of Orz pandas is x, x mod 2 must be b[i]. (1<=i<=n)
For example, if n=2 and m=3,a[1..3]={1,1,1},b[1..2]={1,0}
Now, Big Big Xi wants to know there are how many adapted ways to insert the pandas.
输入
There are multiple test cases (no more than 100,and no more than 10 test cases with large n and m), please process to EOF.
In each test case,there are two numbers N and M at the first line.(0<n<=10, 0<m<=100)
Then m lines, the ith line has a number indicates a[i].
And then n lines,the ith line has a number indicates b[i].
输出
One number which is the answer of the question (mod by 1e9+7)
样例输入
1 1
1
1
2 3
1
1
1
1
0
样例输出
1
4
xdoj-1117(记忆化搜索+组合数学)的更多相关文章
- 【10.31校内测试】【组合数学】【记忆化搜索/DP】【多起点多终点二进制拆位Spfa】
Solution 注意取模!!! Code #include<bits/stdc++.h> #define mod 1000000007 #define LL long long usin ...
- [CSP-S模拟测试]:彩球问题(记忆化搜索)
题目传送门(内部题91) 输入格式 第一行一个正整数$N$,表示颜色种类数. 第二行$N$个正整数$k[i],k[i]$表示第$i$种颜色的数量$(1\leqslant k[i]\leqslant 3 ...
- [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...
- 【BZOJ-3895】取石子 记忆化搜索 + 博弈
3895: 取石子 Time Limit: 1 Sec Memory Limit: 512 MBSubmit: 263 Solved: 127[Submit][Status][Discuss] D ...
- hdu3555 Bomb (记忆化搜索 数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Memory ...
- zoj 3644(dp + 记忆化搜索)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834 思路:dp[i][j]表示当前节点在i,分数为j的路径条数,从 ...
- loj 1044(dp+记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26764 思路:dp[pos]表示0-pos这段字符串最少分割的回文 ...
- DP(记忆化搜索) + AC自动机 LA 4126 Password Suspects
题目传送门 题意:训练指南P250 分析:DFS记忆化搜索,范围或者说是图是已知的字串构成的自动机图,那么用 | (1 << i)表示包含第i个字串,如果长度为len,且st == (1 ...
- HDU1978 记忆化搜索
How many ways Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
随机推荐
- rdesktop安装教程
1.介绍 rdesktop是Linux下连接windows远程桌面的工具 2.下载 https://github.com/rdesktop/rdesktop/releases 3.安装 mkdir / ...
- suffix word cy dom faction ful fold form out1
1★cy ﹎﹎﹎﹎性质,状态 2★ dom ﹎﹎﹎﹎领域,范围 1★ faction ﹎﹎﹎﹎达到什么样的状态 2★ ful ﹎﹎﹎﹎满,量 *******有~的 3★ fold ﹎﹎﹎﹎双, ...
- BeanUtils.copyProperties(A,B)使用注意事项
***最近项目中用到BeanUtils.copyProperties(),然后踩了一些坑,也在网上查看了很多同行的测试和总结,现在将自己的测试.整理的注意事项分享如下,希望大家一起学习进步. ***注 ...
- Win10系列:JavaScript动画3
"交叉进出"动画也是Windows动画库中的动画效果."交叉进出"动画的动画效果是在应用程序界面上隐藏一个元素并同时在相同位置显示另一个元素的时候,被隐藏的元素 ...
- UVa Live 3635 - Pie 贪心,较小的可能不用 难度: 2
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- http协商缓存VS强缓存
之前一直对浏览器缓存只能描述一个大概,深层次的原理不能描述上来:终于在前端的两次面试过程中被问倒下,为了泄恨,查阅一些资料最终对其有了一个更深入的理解,废话不多说,赶紧来看看浏览器缓存的那些事吧,有不 ...
- Resharper插件的使用
一.Resharper设置 1.1 智能提示 安装完毕后,IDE 的智能提示(Intellisense)便会默认使用 Resharper 的提示,不知道为什么,我一直不太喜欢它的提示.改过来,是在Op ...
- Python Django 之 直接执行自定义SQL语句(二)
转载自:https://my.oschina.net/liuyuantao/blog/712189 一般来说,最好用 Django 自带的模型来实现这些操作.这里仅仅只是为了学习使用原始 SQL 而做 ...
- uitableView group模式下的间距问题
我么在使用group模式定义tableview的时候,系统默认是会有head和foot的间距的,来区分我们不同的group:在具体使用的时候又时候我们不需要这个间距.我们可以重新赋值这些间距来达到我们 ...
- 给rm命令设置别名防止误操作
1通过alias命令查看别名格式并按照格式修改 alias rm='rm -i' 修改为 alias rm='echo command not found' 2通过编辑vim /etc/profile ...