bzoj1566【Noi2009】管道取珠
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1566
两个栈不断pop,共C(n+m,n)种,ai表示每个相同序列的方案数,求∑(ai^2)
sol :首先,将相同的序列看做两个人选取后相同的方案数
考虑Dp,dp[i][j][k][l]表示第一个人从上面选i个,下面选j个,第二个人上k个下l个的答案
显然第四维状态可以由前三维决定
不过还是不太好转移,将状态换为dp[i][j][k]表示选了i个点,第一个人从上面选了j个,第二个人从上面选了k个的答案
这样的话第一维还可以用滚动数组优化
所以转移如下(tmp=0或1)
if(a[j+]==b[i-k+]) dp[!tmp][j+][k]=(dp[!tmp][j+][k]+dp[tmp][j][k])%p;
if(b[i-j+]==a[k+]) dp[!tmp][j][k+]=(dp[!tmp][j][k+]+dp[tmp][j][k])%p;
if(b[i-j+]==b[i-k+]) dp[!tmp][j][k]=(dp[!tmp][j][k]+dp[tmp][j][k])%p;
if(a[j+]==a[k+]) dp[!tmp][j+][k+]=(dp[!tmp][j+][k+]+dp[tmp][j][k])%p;
代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int Mx=;
const int p=;
int n,m,a[Mx],b[Mx],dp[][Mx][Mx];
char c1[Mx],c2[Mx];
int main()
{
scanf("%d%d",&n,&m);
scanf("%s%s",c1,c2);
for(int i=;i<n;i++) a[n-i]=c1[i]-'A';
for(int i=;i<m;i++) b[m-i]=c2[i]-'A';
dp[][][]=;
for (int i=;i<n+m;i++)
{
int tmp=i%;
for(int j=;j<=n&&j<=i;j++)
for(int k=;k<=n&&j<=i;k++)
if(dp[tmp][j][k]!=)
{
if(a[j+]==b[i-k+]) dp[!tmp][j+][k]=(dp[!tmp][j+][k]+dp[tmp][j][k])%p;
if(b[i-j+]==a[k+]) dp[!tmp][j][k+]=(dp[!tmp][j][k+]+dp[tmp][j][k])%p;
if(b[i-j+]==b[i-k+]) dp[!tmp][j][k]=(dp[!tmp][j][k]+dp[tmp][j][k])%p;
if(a[j+]==a[k+]) dp[!tmp][j+][k+]=(dp[!tmp][j+][k+]+dp[tmp][j][k])%p;
dp[tmp][j][k]=;
}
}
cout<<dp[(n+m)%][n][n]<<endl;
return ;
}
bzoj1566【Noi2009】管道取珠的更多相关文章
- BZOJ1566 [NOI2009]管道取珠 【dp】
题目 输入格式 第一行包含两个整数n, m,分别表示上下两个管道中球的数目. 第二行为一个AB字符串,长度为n,表示上管道中从左到右球的类型.其中A表示浅色球,B表示深色球. 第三行为一个AB字符串, ...
- bzoj1566: [NOI2009]管道取珠 DP
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1566 思路 n个球,第i个球颜色为ai,对于颜色j,对答案的贡献为颜色为j的球的个数的平 ...
- bzoj1566 [NOI2009]管道取珠——DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1566 一眼看上去很懵... 但是答案可以转化成有两个人在同时取珠子,他们取出来一样的方案数: ...
- [bzoj1566][NOI2009]管道取珠
来自FallDream的博客,未经允许,请勿转载,谢谢. n<=500 神题...... 发现这个平方可以看作两个序列相同的对数 然后就可以表示状态了. f[i][j][k]表示两个序列各选了 ...
- 【BZOJ 1566】 1566: [NOI2009]管道取珠 (DP)
1566: [NOI2009]管道取珠 Time Limit: 20 Sec Memory Limit: 650 MBSubmit: 1659 Solved: 971 Description In ...
- Bzoj 1566: [NOI2009]管道取珠(DP)
1566: [NOI2009]管道取珠 Time Limit: 20 Sec Memory Limit: 650 MB Submit: 1558 Solved: 890 [Submit][Status ...
- NOI2009 管道取珠 神仙DP
原题链接 原题让求的是\(\sum\limits a_i^2\),这个东西直接求非常难求.我们考虑转化一下问题. 首先把\(a_i^2\)拆成\((1+1+...+1)(1+1+...+1)\),两个 ...
- BZOJ.1566.[NOI2009]管道取珠(DP 思路)
BZOJ 洛谷 考虑\(a_i^2\)有什么意义:两个人分别操作原序列,使得得到的输出序列都为\(i\)的方案数.\(\sum a_i^2\)就是两人得到的输出序列相同的方案数. \(f[i][j][ ...
- 【题解】NOI2009管道取珠
又是艰难想题的一晚,又是做不出来的一题 (:д:) 好想哭啊…… 这题最关键的一点还是提供一种全新的想法.看到平方和这种东西,真的不好dp.然而我一直陷在化式子的泥潭中出不来.平方能够联想到什么?原本 ...
- BZOJ1566:[NOI2009]管道取珠——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1566 https://www.luogu.org/problemnew/show/P1758 题目 ...
随机推荐
- UVA 12171 (hdu 2771)sculptrue(离散化)
以前对离散化的理解不够,所以把端点和区间区分来考虑但是做完这题以后有了新的认识: 先来看一个问题:给你以下的网格,你需要多少空间去存储红点区间的信息呢? 只需要图上所示的1,2,3,4个点就足够表示红 ...
- Sublime +Markdown+OmniMarkupPreviewer 搭建实时预览的markdown编辑器
浏览器实时预览 <meta http-equiv="refresh" content="0.1"> auto save 的配置 {"aut ...
- Vue中npm run build报“Error in parsing SVG: Unquoted attribute value”
自己做的一个Vue项目,在打包时老是报这个错误 # Error in parsing SVG: Unquoted attribute value 查了查网上说的,都说报错原因是压缩和抽离CSS的插件中 ...
- Hibernate中session的save方法问题
今天在使用session.save(),进行插入数据操作时,一直没有成功,也没有报错.后来发现是因为没有创建事务,提交事务的原因 你对flush和commit的意思没有理解到:1,flush代表刷新, ...
- Js笔记 14
<script> // <!-- 课 对象 // //对象的创建方法 // 1.var obj = {} plainobject 对象字面量 对象直接量 // 2.构造函数 ...
- cocos2x (c++/lua) spine 文件的预加载
在之前,笔者写过一编博客,通过lua在加载场景加载spineAnimation动画精灵,保存在table中,然后在游戏中创建动画精灵时,提取加载好的spineAnimaiton中的 spSkeleto ...
- 洛谷 P3601 签到题
https://www.luogu.org/problemnew/show/P3601 一道关于欧拉函数的题. 读完题目以后我们知道所谓的$aindao(x)=x- \phi (x) $. 对于x小的 ...
- Docker 在容器中部署静态网站
Docker 在容器中部署静态网站 在容器中部署静态网站 设置容器的端口映射 run -P``--publish-all=true|false:容器暴露的所有端口进行映射 -p``--publish= ...
- 03等待多个线程返回WaitForMultipleObject
二. WaitForMultipleObject 等待单个线程返回 1. 函数原型 DWORD WINAPI WaitForMultipleObjects( _In_ DWORD nCount, _I ...
- GOPATH和GOROOT
安装指定版本golang apt-get purge golang* //删除之前安装的文件 add-apt-repository ppa:evarlast/golang-1.8 apt-get up ...