1566: [NOI2009]管道取珠

Time Limit: 20 Sec  Memory Limit: 650 MB
Submit: 1659  Solved: 971

Description

Input

第一行包含两个整数n, m,分别表示上下两个管道中球的数目。 第二行为一个AB字符串,长度为n,表示上管道中从左到右球的类型。其中A表示浅色球,B表示深色球。 第三行为一个AB字符串,长度为m,表示下管道中的情形。

Output

仅包含一行,即为 Sigma(Ai^2) i从1到k 除以1024523的余数。

Sample Input

2 1
AB
B

Sample Output

5

HINT

样例即为文中(图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)相关推荐

  1. 洛谷P1758 [NOI2009]管道取珠(dp 贡献转化)

    题目 bzoj1566 两个管道的小球序列, 分别用长为n(n<=500)和长为m(m<=500)的仅由A和B构成的字符串表示 两个管道归并的时候,每次可以从上管道取一个球,也可以从下管道 ...

  2. [NOI2009]管道取珠

    题目描述 管道取珠是小X很喜欢的一款游戏.在本题中,我们将考虑该游戏的一个简单改版.游戏画面如图1所示: (图1) 游戏初始时,左侧上下两个管道分别有一定数量的小球(有深色球和浅色球两种类型),而右侧 ...

  3. 洛谷 - P1758 [NOI2009]管道取珠(计数dp)

    题目链接:点击查看 题目大意:给出两个长度分别为 n 和 m 的管道,每个管道中都只有两种颜色的珠子,现在可以按照规则组成序列,共可以组成 C( n+m , n ) 个序列,假设共组成了 K 种不同的 ...

  4. BZOJ1566 [NOI2009]管道取珠

    这是一道思维复杂度很高的DP题 看题目,为什么是取两次序列一样呢?YY一下,其实等价于两个人一起取,最后序列一样. 然后就水了: 令f[i, j, k]表示取到第i个珠子,第一个人在1号管道取了j个珠 ...

  5. Bzoj 1566: [NOI2009]管道取珠(动态规划-神题)

    以下内容来自ShallWe's Blog 题目 题目链接 Description Input 第一行包含两个整数n, m,分别表示上下两个管道中球的数目. 第二行为一个AB字符串,长度为n,表示上管道 ...

  6. BZOJ1566:[NOI2009]管道取珠——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=1566 https://www.luogu.org/problemnew/show/P1758 题目 ...

  7. 牛客网 【每日一题】5月29日 管道取珠

    链接: 文章目录 题目描述 题意: 题解: 代码: 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言1048576K 64bit IO Format: %lld ...

  8. P1758-[NOI2009]管道取珠【dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P1758 题目大意 给出一个大小为nnn和一个大小为mmm的栈,每次选择一个栈弹出栈顶然后记录这个字母,求所有弹出序 ...

  9. 2017.10.28 管道取珠 失败总结

    这个题有一个新套路:  ∑ai^2 要知道一般的计数题是∑ai,,所以这多乘了一个自己有什么意义呢? 于是想到,两两枚举,加起来正好是ai^2:: 所以就有一个想法,枚举两种取法, 然后就是插数dp, ...

最新文章

  1. leetcode436. 寻找右区间(二分法)
  2. mysql 内存 256m_解决mySQL占用内存超大问题
  3. linux rm 命令删除文件恢复_Linux之恢复误删除文件
  4. Arduino笔记-人体感应灯项目
  5. 剧情很有趣:安全专家被骗记
  6. 基于阿里云的MQTT远程控制
  7. cmd后台运行exe_了解运行命令的原理,为QQ制作运行命令启动
  8. jQuery AJAX 方法
  9. 太赞了! 豆瓣9.3分的《Linux 命令行大全》.pdf 限时下载
  10. 植物大战僵尸花瓶终结者(砸罐子)无尽模式47波通关小技巧攻略
  11. 华为路由器配置备忘录
  12. 腾讯云轻量服务器和虚拟主机VPS有什么区别?
  13. 人、机、料、法、环 全面理解
  14. ASP.NET程序读取二代身份证(附源码)
  15. CIO:人工智能将改变企业IT
  16. 无人机测量技术在房地一体项目中的应用
  17. cocos2dx+JAVA手游《全民挂机》全套源码支持安卓+IOS双端
  18. centos 6.7 mysql密码忘记_CentOS 7安装MySQL5.7以及忘记root密码怎么办
  19. 3DM:phase wrapping
  20. 录取为2021年同济大学秋季博士研究生(电子与信息工程学院计算机科学与技术)

热门文章

  1. linux删除指定端口的进程
  2. 推荐Web开发人员应有的7款免费的Android应用
  3. TCP三次握手的原理及***手段
  4. 生理性玻璃体混浊的分类与预防控制
  5. neo4jd3的使用流程(转载)
  6. 总结-各种安全漏洞学习环境集合(转)
  7. OpenCV学习笔记七-创建滑动条
  8. C/C++编程心得(三)
  9. 图像处理理论(五)——SIFT
  10. oracle实验使用游标,Oracle数据库实验-PLSQL游标、过程、函数、包的使用