题目

bzoj1566

两个管道的小球序列,

分别用长为n(n<=500)和长为m(m<=500)的仅由A和B构成的字符串表示

两个管道归并的时候,每次可以从上管道取一个球,也可以从下管道取一个球

假设最终可能产生的不同种类的输出序列共有K种,

其中第i种输出序列的产生方式(即不同的操作方式数目)有ai个。

聪明的小X早已知道,

因此,小X希望计算得到

你能帮助他计算这个值么?

由于这个值可能很大,因此只需要输出该值对1024523的取模即可(即除以1024523的余数)。

说明:文中C(n+m,n)表示组合数。组合数C(a,b)等价于在a个不同的物品中选取b个的选取方案数。

思路来源

https://www.luogu.com.cn/blog/user23116/solution-p1758 第一种dp

https://blog.csdn.net/pocket_lengend/article/details/79821748 第二种dp

题解

首先要理解一点,最终出现的每一个序列如果出现ai次,其贡献是ai^2

这等价于,对一个序列取两次,取两次的过程中出现两个序列相同的方案数,

设某个序列出现了a次,则在第一次里出现了a次,第二次里也出现了a次,

则对于该序列来说,第一次=第二次的方案数为a*a次,即a^2次,

理解了这一点后,有两种dp方式,

一种是dp[i][j][k][l]表示第一次第一个管道取了i个,第一次第二个管道j个

第二次第一个管道取了k个,第二次第二个管道取了l个的完全相同序列(p,q)对的方案数

把第四维优化掉就是dp[i][j][k],再把第一维滚动一下得到dp[2][505][505]

另一种是考虑总长,i+j=k+l,

所以dp[len][j][k]表示总长为len,第一次第一个管道取了j个,第二次第一个管道取了k个

的完全相同序列(p,q)对的方案数,第二种更便于写转移和理解,虽然看似多了一个二倍的常数

代码

#include<bits/stdc++.h>
using namespace std;
const int N=505,mod=1024523;
int n,m,dp[2][N][N];
char s[N],t[N];
void add(int &x,int y){x+=y;x%=mod;
}
int main(){dp[0][0][0]=1;scanf("%d%d",&n,&m);scanf("%s%s",s+1,t+1);for(int i=0,f=0;i<n+m;++i,f^=1){for(int j=0;j<=min(i,n);++j){for(int k=0;k<=min(i,n);++k){if(s[j+1]==s[k+1])add(dp[f^1][j+1][k+1],dp[f][j][k]);if(s[j+1]==t[i+1-k])add(dp[f^1][j+1][k],dp[f][j][k]);if(t[i+1-j]==s[k+1])add(dp[f^1][j][k+1],dp[f][j][k]);if(t[i+1-j]==t[i+1-k])add(dp[f^1][j][k],dp[f][j][k]);dp[f][j][k]=0;}}}printf("%d\n",dp[(n+m)&1][n][n]);return 0;
}

洛谷P1758 [NOI2009]管道取珠(dp 贡献转化)相关推荐

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

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

  2. 【BZOJ 1566】 1566: [NOI2009]管道取珠 (DP)

    1566: [NOI2009]管道取珠 Time Limit: 20 Sec  Memory Limit: 650 MB Submit: 1659  Solved: 971 Description I ...

  3. [NOI2009]管道取珠

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

  4. BZOJ1566 [NOI2009]管道取珠

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

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

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

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

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

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

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

  8. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  9. 洛谷 P3205 [HNOI2010]合唱队(区间dp)

     题目链接: [HNOI2010]合唱队 - 洛谷https://www.luogu.com.cn/problem/P3205  思路: 这题我是看了题解才做出来的,贴一下这位大佬的博客题解 P320 ...

最新文章

  1. oracle 字段 查找重复,oracle数据库查询重复的索引列
  2. 安装python3.7.0的步骤_CentOS7下简单安装python3.7.0步骤
  3. java 短链接实现方案_java利用百度短网址api实现URL长短互换工具类分享
  4. (搬家文) c++引用深入探讨
  5. 7 CO配置-控制-一般控制-维护版本
  6. Cheat Engine 6.8 设置中文
  7. 设计模式(4)—— 简单工厂模式(Simple Factory,创建型)
  8. 推荐几款好用的Chrome扩展插件
  9. 反三角函数的积分公式
  10. 非常好的油画制作软件ArtRage.v2.11
  11. 什么是SDN?用一篇文章彻底讲明白 SDN 软件定义网络是什么!
  12. 如何把照片kb缩小?详细步骤
  13. 永不消失的电波 2020.12.07
  14. #pragma comment 用法
  15. 3.2计算机网络(停止-等待协议 后退N帧协议 选择重传协议)
  16. 在线问诊小程序|互联网医院系统好处有哪些?
  17. empress和queen区别_王后和皇后有什么区别?
  18. urllib3.exceptions.MaxRetryError问题的解决
  19. HDOJ 5498 Tree
  20. ent en et的区别

热门文章

  1. 超级3GP转换器 V1.6.3.0 纯免费的
  2. (附源码连接)利用AI将2D照片合成3D场景
  3. 电脑安装linux点歌系统,如何组装单机版电脑点歌系统
  4. 攻防世界 Miscellaneous-200
  5. Cocos2D教程:使用SpriteBuilder和Cocos2D 3.x开发横版动作游戏——Part 1
  6. LINUX学记笔记17
  7. ARM neon详解
  8. eclipse安装图形界面插件
  9. 【原创】5.4青年有感
  10. kernel获取毫秒、微妙时间