【BZOJ 1566】 1566: [NOI2009]管道取珠 (DP)
1566: [NOI2009]管道取珠
Time Limit: 20 Sec Memory Limit: 650 MB
Submit: 1659 Solved: 971Description
Input
第一行包含两个整数n, m,分别表示上下两个管道中球的数目。 第二行为一个AB字符串,长度为n,表示上管道中从左到右球的类型。其中A表示浅色球,B表示深色球。 第三行为一个AB字符串,长度为m,表示下管道中的情形。Output
仅包含一行,即为 Sigma(Ai^2) i从1到k 除以1024523的余数。Sample Input
2 1
AB
BSample Output
5HINT
样例即为文中(图3)。共有两种不同的输出序列形式,序列BAB有1种产生方式,而序列BBA有2种产生方式,因此答案为5。
【大致数据规模】
约30%的数据满足 n, m ≤ 12;
约100%的数据满足n, m ≤ 500。Source
【分析】
我真是超级蠢啊。。。想了很久都想不到。。。。
一直二维DP搞来搞去搞不了!!!
注意求的是ai^2的和 平方!!!
也就是说,可以看成,两个人在取,问他们取出来的排列相同的方案有多少种。
那么本来的四维DP可以缩成三维,就直接递推就好了。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 #define Mod 1024523 8 #define Maxn 510 9 10 char s[Maxn]; 11 int a[Maxn],b[Maxn],f[Maxn][Maxn][Maxn]; 12 13 int main() 14 { 15 int n,m; 16 scanf("%d%d",&n,&m); 17 scanf("%s",s+1); 18 for(int i=1;i<=n;i++) a[i]=s[i]-'A';a[n+1]=10; 19 scanf("%s",s+1); 20 for(int i=1;i<=m;i++) b[i]=s[i]-'A';b[m+1]=100; 21 memset(f,0,sizeof(f)); 22 f[n][m][n]=1; 23 for(int i=n;i>=0;i--) 24 for(int j=m;j>=0;j--) 25 for(int k=n;k>=0;k--) 26 { 27 int l=i+j-k; 28 if(l<0||l>m||(i==n&&j==m)) continue; 29 // f[i][j][k]=0; 30 if(a[i+1]==a[k+1]) f[i][j][k]=(f[i][j][k]+f[i+1][j][k+1])%Mod; 31 if(a[i+1]==b[l+1]) f[i][j][k]=(f[i][j][k]+f[i+1][j][k])%Mod; 32 if(b[j+1]==a[k+1]) f[i][j][k]=(f[i][j][k]+f[i][j+1][k+1])%Mod; 33 if(b[j+1]==b[l+1]) f[i][j][k]=(f[i][j][k]+f[i][j+1][k])%Mod; 34 } 35 printf("%d\n",f[0][0][0]); 36 return 0; 37 }
View Code
2017-04-01 09:57:53
转载于:https://www.cnblogs.com/Konjakmoyu/p/6654682.html
【BZOJ 1566】 1566: [NOI2009]管道取珠 (DP)相关推荐
- 洛谷P1758 [NOI2009]管道取珠(dp 贡献转化)
题目 bzoj1566 两个管道的小球序列, 分别用长为n(n<=500)和长为m(m<=500)的仅由A和B构成的字符串表示 两个管道归并的时候,每次可以从上管道取一个球,也可以从下管道 ...
- [NOI2009]管道取珠
题目描述 管道取珠是小X很喜欢的一款游戏.在本题中,我们将考虑该游戏的一个简单改版.游戏画面如图1所示: (图1) 游戏初始时,左侧上下两个管道分别有一定数量的小球(有深色球和浅色球两种类型),而右侧 ...
- 洛谷 - P1758 [NOI2009]管道取珠(计数dp)
题目链接:点击查看 题目大意:给出两个长度分别为 n 和 m 的管道,每个管道中都只有两种颜色的珠子,现在可以按照规则组成序列,共可以组成 C( n+m , n ) 个序列,假设共组成了 K 种不同的 ...
- BZOJ1566 [NOI2009]管道取珠
这是一道思维复杂度很高的DP题 看题目,为什么是取两次序列一样呢?YY一下,其实等价于两个人一起取,最后序列一样. 然后就水了: 令f[i, j, k]表示取到第i个珠子,第一个人在1号管道取了j个珠 ...
- Bzoj 1566: [NOI2009]管道取珠(动态规划-神题)
以下内容来自ShallWe's Blog 题目 题目链接 Description Input 第一行包含两个整数n, m,分别表示上下两个管道中球的数目. 第二行为一个AB字符串,长度为n,表示上管道 ...
- BZOJ1566:[NOI2009]管道取珠——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1566 https://www.luogu.org/problemnew/show/P1758 题目 ...
- 牛客网 【每日一题】5月29日 管道取珠
链接: 文章目录 题目描述 题意: 题解: 代码: 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言1048576K 64bit IO Format: %lld ...
- P1758-[NOI2009]管道取珠【dp】
正题 题目链接:https://www.luogu.com.cn/problem/P1758 题目大意 给出一个大小为nnn和一个大小为mmm的栈,每次选择一个栈弹出栈顶然后记录这个字母,求所有弹出序 ...
- 2017.10.28 管道取珠 失败总结
这个题有一个新套路: ∑ai^2 要知道一般的计数题是∑ai,,所以这多乘了一个自己有什么意义呢? 于是想到,两两枚举,加起来正好是ai^2:: 所以就有一个想法,枚举两种取法, 然后就是插数dp, ...
最新文章
- leetcode436. 寻找右区间(二分法)
- mysql 内存 256m_解决mySQL占用内存超大问题
- linux rm 命令删除文件恢复_Linux之恢复误删除文件
- Arduino笔记-人体感应灯项目
- 剧情很有趣:安全专家被骗记
- 基于阿里云的MQTT远程控制
- cmd后台运行exe_了解运行命令的原理,为QQ制作运行命令启动
- jQuery AJAX 方法
- 太赞了! 豆瓣9.3分的《Linux 命令行大全》.pdf 限时下载
- 植物大战僵尸花瓶终结者(砸罐子)无尽模式47波通关小技巧攻略
- 华为路由器配置备忘录
- 腾讯云轻量服务器和虚拟主机VPS有什么区别?
- 人、机、料、法、环 全面理解
- ASP.NET程序读取二代身份证(附源码)
- CIO:人工智能将改变企业IT
- 无人机测量技术在房地一体项目中的应用
- cocos2dx+JAVA手游《全民挂机》全套源码支持安卓+IOS双端
- centos 6.7 mysql密码忘记_CentOS 7安装MySQL5.7以及忘记root密码怎么办
- 3DM:phase wrapping
- 录取为2021年同济大学秋季博士研究生(电子与信息工程学院计算机科学与技术)