Bzoj 1566: [NOI2009]管道取珠(DP)
1566: [NOI2009]管道取珠
Time Limit: 20 Sec Memory Limit: 650 MB
Submit: 1558 Solved: 890
[Submit][Status][Discuss]
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;
/*
一道DP.
比较妙.
题意相同类型的序列有x个,对答案贡献是x^2。
等价于两个人各自进行操作,得到相同类型序列的方案数.
这个东西是比较好证的。
我们设一个合法序列状态是A,并且现在有x,y两种取法均能得到A
根据乘法原理,那么问题就转化为求A(x,y)二元组的个数.
想象一下现在有两个人正在取数,要求两个人取数相同的方案个数.
令f[i][j][k]表示
people 1 在上面取了i个,下面取了j个
people 2 在上面取了k个,下面取了i+j-k个
people1和people2都取了i+j个数的相同方案的方案个数。
然后枚举上一次取的位置转移即可。。
*/
#include<iostream>
#include<cstdio>
#define mod 1024523
#define MAXN 501
using namespace std;
char a[MAXN],b[MAXN];
int n,m,f[MAXN][MAXN][MAXN];
int main()
{
scanf("%d %d",&n,&m);
scanf("%s",a+1);
scanf("%s",b+1);
for(int i=1;i<=n/2;i++) swap(a[i],a[n-i+1]);
for(int i=1;i<=m/2;i++) swap(b[i],b[m-i+1]);
f[0][0][0]=1;
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
for(int k=0;k<=n;k++)
{
int l=i+j-k;int * p=&f[i][j][k];
if(l<0||l>m) continue;
if(i&&k&&a[i]==a[k]) *p=(*p+f[i-1][j][k-1])%mod;
if(i&&l&&a[i]==b[l]) *p=(*p+f[i-1][j][k])%mod;
if(j&&k&&b[j]==a[k]) *p=(*p+f[i][j-1][k-1])%mod;
if(j&&l&&b[j]==b[l]) *p=(*p+f[i][j-1][k])%mod;
}
printf("%d",f[n][m][n]);
return 0;
}
Bzoj 1566: [NOI2009]管道取珠(DP)的更多相关文章
- BZOJ.1566.[NOI2009]管道取珠(DP 思路)
BZOJ 洛谷 考虑\(a_i^2\)有什么意义:两个人分别操作原序列,使得得到的输出序列都为\(i\)的方案数.\(\sum a_i^2\)就是两人得到的输出序列相同的方案数. \(f[i][j][ ...
- bzoj 1566: [NOI2009]管道取珠【dp】
想不出来想不出来 仔细考虑平方的含义,我们可以把它想成两个人同时操作,最后得到相同序列的情况 然后就比较简单了,设f[t][i][j]为放了t个珠子,A的上方管道到了第i颗珠子,B的上方管道到了第j颗 ...
- bzoj 1566: [NOI2009]管道取珠
Description Input 第一行包含两个整数n, m,分别表示上下两个管道中球的数目. 第二行为一个AB字符串,长度为n,表示上管道中从左到右球的类型.其中A表示浅色球,B表示深色球. ...
- 【BZOJ 1566】 1566: [NOI2009]管道取珠 (DP)
1566: [NOI2009]管道取珠 Time Limit: 20 Sec Memory Limit: 650 MBSubmit: 1659 Solved: 971 Description In ...
- 1566: [NOI2009]管道取珠 - BZOJ
Description Input第一行包含两个整数n, m,分别表示上下两个管道中球的数目. 第二行为一个AB字符串,长度为n,表示上管道中从左到右球的类型.其中A表示浅色球,B表示深色球. 第三行 ...
- 【BZOJ】1566: [NOI2009]管道取珠
题解 假如我们非常熟练的看出来,平方和转有序对统计的套路的话,应该就不难了 我们只需要统计(wayA,wayB)生成的序列一样的有序对个数就行 可以用一个\(n^3\)的dp解决 \(dp[i][j] ...
- bzoj1566: [NOI2009]管道取珠 DP
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1566 思路 n个球,第i个球颜色为ai,对于颜色j,对答案的贡献为颜色为j的球的个数的平 ...
- [NOI2009]管道取珠 DP + 递推
---题面--- 思路: 主要难点在思路的转化, 不能看见要求$\sum{a[i]^2}$就想着求a[i], 我们可以对其进行某种意义上的拆分,即a[i]实际上可以代表什么? 假设我们现在有两种取出某 ...
- bzoj1566 [NOI2009]管道取珠——DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1566 一眼看上去很懵... 但是答案可以转化成有两个人在同时取珠子,他们取出来一样的方案数: ...
随机推荐
- zabbix添加自定义监控(自动发现)遇到的问题
问题:zabbix添加自动发现端口,提示Value should be a JSON object [root@localhost zabbix_agentd.d]# zabbix_get -s 19 ...
- hdu 1501 贪心问题
这道题目的关键就是逐个搜索的过程 找个时间得复习一下dfs了 这里使用temp作为参照变量 每次比较以后(由于已经排序好) 已temp为参照进行下一次的比较
- zabbix 数据库分表操作
近期zabbix数据库占用的io高,在页面查看图形很慢,而且数据表已经很大,将采用把数据库的数据目录移到新的磁盘,将几个大表进行分表操作 一.数据迁移: 1.数据同步到新的磁盘上,先停止mysql(不 ...
- javascript 之 Object.defineProperty
语法: Object.definePropty(obj,prop,descriptor); 参数: obj:要在其上定义属性的属性 prop:要定义或修改的属性的名称 desriptor:将被定义或修 ...
- C# SpinLock用法。
class Program { static void Main(string[] args) { ; ]; Stopwatch sp = new Stopwatch(); sp.Start(); / ...
- C#Modbus Rtu的实现
Modbus Rtu的实现与Modbus Tcp的实现类似 C#ModBus Tcp的学习及Master的实现 我们还是需要借用一个开源库NModbus4,在vs中.打开NuGet管理器.安装NMod ...
- AJAX with JSP and Servlet(代码)
欢迎任何形式的转载,但请务必注明出处. 本章内容来自YouTube需翻墙(点击进入视频学习) 服务器配置等可以参看我其他文章.注释等后续再加 效果图 结构 <body> <fie ...
- 解决 VUE项目过大nodejs内存溢出问题
今天在启动vue项目的时候报了这样一个错误, 如图所示:频繁出现此种情况,项目太大,导致内存溢出,排除代码问题外,可参照以下方式解决 // 全局安装increase-memory-limit npm ...
- FreeRTOS 任务挂起和恢复
在使用RTOS的时候一个实时应用可以作为一个独立的任务.每个任务都有自己的运行环境, 不依赖于系统中其他的任务或者RTOS调度器. 任何一个时间点只能有一个任务运行,具体运行哪个任务是由RTOS调度器 ...
- 表格分页——tablePagination
背景:表格是最为通用的展示方式,为了展示的统一性,以及分页组件的重用,这里写一个分页组件,供比较多或者较少数据2种表格进行分页展示. 分页组件: <template> <el-pag ...