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 题目 ...
随机推荐
- [dp]uestc oj E - 菲波拉契数制
E - 菲波拉契数制 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- 撤销git pull命令
比如:在master分支上执行了git pull命令,想回到pull之前分支所在的commit位置. 步骤一:用 git reflog master 查看master分支的历史变动记录,其中有一个就是 ...
- appium---启动app
自动化测试是测试人员必备的一项技能,所谓的自动化就是通过代码完成了手工的操作,今天就总结下如何通过python启动app 环境条件 1.安装python:下载地址 2.安装JDK:下载地址 3.安装A ...
- Java动画 重力弹球 如鹏游戏引擎 精灵 设计一个小球加速落地又减速弹起并反复直到停止的Java程序
package com.swift; import com.rupeng.game.GameCore; public class BouncingBall implements Runnable { ...
- 协议(Protocol)与委托代理(Delegate)
协议(Protocol)的作用: 1. 规范接口,用来定义一套公用的接口: 2. 约束或筛选对象. 代理(Delegate): 它本身是一种设计模式,委托一个对象<遵守协议>去做某件事情, ...
- NOIP模拟赛 密室逃脱
密室逃脱(maze.*) 即使czhou没有派出最强篮球阵容,机房篮球队还是暴虐了校篮球队.为了不打击校篮球队信心,czhou决定改变训练后的活动.近来,江大掌门的徒弟徒孙们纷纷事业有成,回到母校为机 ...
- 15.Yii2.0框架where单表查询
目录 新建控制器 HomeController.php 新建model article.php 新建控制器 HomeController.php D:\xampp\htdocs\yii\control ...
- CRC点滴
研究了一个晚上,大致看懂了crc校验的方法.这里记录一下,因为can总线中需要用到crc校验的. 举例说明CRC校验码的求法:(此例子摘自百度百科:CRC校验码) 信息字段代码为: 1011001:对 ...
- lwqq
源码安装lwqq 加密保存密码 发送截图
- HDU 3473 Minimum Sum 划分树
题意: 给出一个长度为\(n(1 \leq n \leq 10^5)\)的序列\(a\) 有若干次查询l r:找到一个\(x\)使得\(\sum \limits_{l \leq i \leq r} \ ...