P1758 [NOI2009] 管道取珠 题解
题意:
有点复杂,看 原题面 吧。
思路
发现可以等价为两个人独立操作操作出来的序列相同的方案数。
然后发现复杂度阈值可以接受 \(n^3\),因此直接套路地设 \(f_{t,i,j}\) 表示两个人操作了 \(t\) 次后第一个人操作了第一个管道 \(i\) 次,第二个人操作了第一个管道 \(j\) 次的方案数。
这么设计状态的原因是只有两个人操作次数相同才有可能操作出来序列相同,而第二个管道的操作次数在总次数确定的情况下被唯一确定。
然后就是正常的分类讨论,看当前第一个人的管道与第二个人的管道的球有没有对位相等,如果相等就从那里转移过来,然后就做完了。
code
需要注意的是 \(i\) 与 \(j\) 可以取到0。
同时空间开不下 \(n^3\) 的数组,需要写滚动数组。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=505,p=1024523;
int n,m,f[3][N][N];
char a[N],b[N];
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=m;i++) cin>>b[i];
f[0][0][0]=1;
for(int t=1;t<=n+m;t++){
int lst=(t-1)%2,now=lst^1;
for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) f[now][i][j]=0;
for(int i=max(0ll,t-m);i<=min(n,t);i++){
for(int j=max(0ll,t-m);j<=min(n,t);j++){
if(i>0&&j>0&&a[i]==a[j]) f[now][i][j]=(f[now][i][j]+f[lst][i-1][j-1])%p;
if(i>0&&a[i]==b[t-j]) f[now][i][j]=(f[now][i][j]+f[lst][i-1][j])%p;
if(j>0&&b[t-i]==a[j]) f[now][i][j]=(f[now][i][j]+f[lst][i][j-1])%p;
if(b[t-i]==b[t-j]) f[now][i][j]=(f[now][i][j]+f[lst][i][j])%p;
}
}
}
cout<<f[((n+m)%2)][n][n];return 0;
}
P1758 [NOI2009] 管道取珠 题解的更多相关文章
- BZOJ1566:[NOI2009]管道取珠——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1566 https://www.luogu.org/problemnew/show/P1758 题目 ...
- luogu P1758 [NOI2009]管道取珠
luogu 这个题中的平方有点东西,考虑他的组合意义,也就是做这个过程两次,如果两次得到的结果一样就给答案+1,所以可以考虑dp,设\(f_{i,j,k,l}\)表示第一个过程中上面取到的第\(i\) ...
- P1758 [NOI2009]管道取珠
考虑这个式子的意义. 不妨看做进行了两轮操作,这个式子显然等价于两次操作后得到的序列相同的方案数. 这个东西显然是可以dp的. 随便优化一下就成了O(n^3)
- 【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.然而我一直陷在化式子的泥潭中出不来.平方能够联想到什么?原本 ...
- 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][ ...
- BZOJ1566 [NOI2009]管道取珠 【dp】
题目 输入格式 第一行包含两个整数n, m,分别表示上下两个管道中球的数目. 第二行为一个AB字符串,长度为n,表示上管道中从左到右球的类型.其中A表示浅色球,B表示深色球. 第三行为一个AB字符串, ...
- 1566: [NOI2009]管道取珠 - BZOJ
Description Input第一行包含两个整数n, m,分别表示上下两个管道中球的数目. 第二行为一个AB字符串,长度为n,表示上管道中从左到右球的类型.其中A表示浅色球,B表示深色球. 第三行 ...
随机推荐
- C# DataTable 类使用
命名空间: System.Data 程序集: System.Data.Common.dll 参考连接:https://docs.microsoft.com/zh-cn/dotnet/api/syste ...
- 用 Dockerfile 创建镜像的基本步骤有哪些?
使用 Dockerfile 创建镜像的基本步骤如下: 定义基础镜像 在 Dockerfile 的开头,使用 FROM 指令指定一个基础镜像.例如: FROM ubuntu:latest 这表示基于最新 ...
- Typecho 引入JS简单的实现点击文字即可复制
在文章中插入大量无意义内容一不美观,二不便复制,不如使用 js 创建隐藏内容的复制按钮吧. 引入 JS 本主题:依次进入 控制台 - 外观 - 设置外观 - 主题自定义扩展,将以下代码加入到 自定义 ...
- 关于Processing开发应用及发布分享的一些经验分享
从2015年10月份开始接触Processing,到现在的2021年9月底,足足有6年了!笔者会竭尽全力把所有学到的知识.经验分享出来.这篇是关于Processing开发应用及发布分享的一些内容,可能 ...
- ubuntu apt 安装报错:Media change: please insert the disc labeled 'Ubuntu 20.04.5 LTS Focal Fossa - Release amd64 (20220831)' in the drive '/cdrom/' and press [Enter]
前言 如果你在 Ubuntu 上使用 apt 安装软件包时遇到 "Media change: please insert the disc labeled ..." 的错误消息,这 ...
- MySQL 常用优化
目录 单表优化 字段 索引 查询SQL 引擎 MyISAM InnoDB 系统调优参数 升级硬件 读写分离 缓存 表分区 分区的好处是: 分区的限制和缺点: 分区的类型: 分区适合的场景有: 垂直拆分 ...
- Flask快速入门4-蓝图
十六,Flask 用蓝图实现模块化的应用 1,Flask 为什么使用蓝图? Flask 中的蓝图为这些情况设计: 把一个应用分解为一个蓝图的集合.这对大型应用是理想的.一个项目可以实例化 一个应用对象 ...
- Portainer安装配置
什么是portainer 官网:https://www.portainer.io/ Portainer(基于 Go) 是一个轻量级的Web管理界面,可让您轻松管理 Docker 主机 或 Swarm ...
- [每日算法 - 华为机试] LeetCode 475. 供暖器
入口 力扣https://leetcode.cn/problems/heaters/submissions/ 题目描述 冬季已经来临. 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖. 在加热 ...
- cURL 工具库基本使用
cURL(Client URL)是一个功能强大的工具和库,用于与各种网络协议进行交互,cURL常用的一些参数和示例代码: -X, --request :指定HTTP请求方法(GET.POST.PUT等 ...