洛谷P1758 [NOI2009]管道取珠(dp 贡献转化)
题目
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 贡献转化)相关推荐
- 洛谷 - P1758 [NOI2009]管道取珠(计数dp)
题目链接:点击查看 题目大意:给出两个长度分别为 n 和 m 的管道,每个管道中都只有两种颜色的珠子,现在可以按照规则组成序列,共可以组成 C( n+m , n ) 个序列,假设共组成了 K 种不同的 ...
- 【BZOJ 1566】 1566: [NOI2009]管道取珠 (DP)
1566: [NOI2009]管道取珠 Time Limit: 20 Sec Memory Limit: 650 MB Submit: 1659 Solved: 971 Description I ...
- [NOI2009]管道取珠
题目描述 管道取珠是小X很喜欢的一款游戏.在本题中,我们将考虑该游戏的一个简单改版.游戏画面如图1所示: (图1) 游戏初始时,左侧上下两个管道分别有一定数量的小球(有深色球和浅色球两种类型),而右侧 ...
- BZOJ1566 [NOI2009]管道取珠
这是一道思维复杂度很高的DP题 看题目,为什么是取两次序列一样呢?YY一下,其实等价于两个人一起取,最后序列一样. 然后就水了: 令f[i, j, k]表示取到第i个珠子,第一个人在1号管道取了j个珠 ...
- BZOJ1566:[NOI2009]管道取珠——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1566 https://www.luogu.org/problemnew/show/P1758 题目 ...
- Bzoj 1566: [NOI2009]管道取珠(动态规划-神题)
以下内容来自ShallWe's Blog 题目 题目链接 Description Input 第一行包含两个整数n, m,分别表示上下两个管道中球的数目. 第二行为一个AB字符串,长度为n,表示上管道 ...
- 牛客网 【每日一题】5月29日 管道取珠
链接: 文章目录 题目描述 题意: 题解: 代码: 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言1048576K 64bit IO Format: %lld ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- 洛谷 P3205 [HNOI2010]合唱队(区间dp)
题目链接: [HNOI2010]合唱队 - 洛谷https://www.luogu.com.cn/problem/P3205 思路: 这题我是看了题解才做出来的,贴一下这位大佬的博客题解 P320 ...
最新文章
- oracle 字段 查找重复,oracle数据库查询重复的索引列
- 安装python3.7.0的步骤_CentOS7下简单安装python3.7.0步骤
- java 短链接实现方案_java利用百度短网址api实现URL长短互换工具类分享
- (搬家文) c++引用深入探讨
- 7 CO配置-控制-一般控制-维护版本
- Cheat Engine 6.8 设置中文
- 设计模式(4)—— 简单工厂模式(Simple Factory,创建型)
- 推荐几款好用的Chrome扩展插件
- 反三角函数的积分公式
- 非常好的油画制作软件ArtRage.v2.11
- 什么是SDN?用一篇文章彻底讲明白 SDN 软件定义网络是什么!
- 如何把照片kb缩小?详细步骤
- 永不消失的电波 2020.12.07
- #pragma comment 用法
- 3.2计算机网络(停止-等待协议 后退N帧协议 选择重传协议)
- 在线问诊小程序|互联网医院系统好处有哪些?
- empress和queen区别_王后和皇后有什么区别?
- urllib3.exceptions.MaxRetryError问题的解决
- HDOJ 5498 Tree
- ent en et的区别