[NOI2009]管道取珠(DP)
因为他要让我们求出每种状态出现次数的平方和,这样模拟两人取球的时候,设第一个人取球的方案为A,第二个人取球的方案为B,
这样对于每一个A,都有C(n + m , n)种B的方案与之对应,所以这样求出来正好是每种状态出现次数的平方和
所以方案数的平方和转化为选两次结果一样的方案数
我们用f[i][j][k][l]表示两个人同时取出了i+j个球,第一个人第1行取了i个球,第二行取了j个球,第二个人第1行取了k个球,第二行取了l个球
省掉一维,再用滚动数组
/*
f[i][j][k]表示第1种方案第一行选了i个,第二行选了j个
第二种方案第一行选了k个,第二行选了i+j-k个
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
const int M = 505 ;
const int mod = 1024523 ;
using namespace std ;
inline int read() {
char c = getchar() ; int x = 0 , w = 1 ;
while(c>'9'||c<'0') { if(c=='-') w = -1 ; c = getchar() ; }
while(c>='0'&&c<='9') { x = x*10+c-'0' ; c = getchar() ; }
return x*w ;
}
int n , m ;
int f[2][M][M] , cur ;
char up[M] , dw[M] ;
int main() {
n = read() ; m = read() ;
scanf("%s",up + 1) ; scanf("%s",dw + 1) ;
f[0][0][0] = 1 ;
for(int i = 0 , l ; i <= n ; i ++ , cur ^= 1)
for(int j = 0 ; j <= m ; j ++)
for(int k = 0 ; k <= n ; k ++) {
if(f[cur][j][k] == 0) continue ;
l = i + j - k ;
if(up[i + 1] == up[k + 1])
f[cur ^ 1][j][k + 1] = (f[cur ^ 1][j][k + 1] + f[cur][j][k])%mod ;
if(up[i + 1] == dw[l + 1])
f[cur ^ 1][j][k] = (f[cur ^ 1][j][k] + f[cur][j][k])%mod ;
if(dw[j + 1] == up[k + 1])
f[cur][j + 1][k + 1] = (f[cur][j + 1][k + 1] + f[cur][j][k])%mod ;
if(dw[j + 1] == dw[l + 1])
f[cur][j + 1][k] = (f[cur][j + 1][k] + f[cur][j][k])%mod ;
f[cur][j][k] = 0 ;//卡常技巧,滚动数组时直接清0,避免memset
}
printf("%d\n",f[cur][m][n]) ;
return 0 ;
}
[NOI2009]管道取珠(DP)的更多相关文章
- Bzoj 1566: [NOI2009]管道取珠(DP)
1566: [NOI2009]管道取珠 Time Limit: 20 Sec Memory Limit: 650 MB Submit: 1558 Solved: 890 [Submit][Status ...
- BZOJ.1566.[NOI2009]管道取珠(DP 思路)
BZOJ 洛谷 考虑\(a_i^2\)有什么意义:两个人分别操作原序列,使得得到的输出序列都为\(i\)的方案数.\(\sum a_i^2\)就是两人得到的输出序列相同的方案数. \(f[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 一眼看上去很懵... 但是答案可以转化成有两个人在同时取珠子,他们取出来一样的方案数: ...
- 【BZOJ 1566】 1566: [NOI2009]管道取珠 (DP)
1566: [NOI2009]管道取珠 Time Limit: 20 Sec Memory Limit: 650 MBSubmit: 1659 Solved: 971 Description In ...
- NOI2009 管道取珠 神仙DP
原题链接 原题让求的是\(\sum\limits a_i^2\),这个东西直接求非常难求.我们考虑转化一下问题. 首先把\(a_i^2\)拆成\((1+1+...+1)(1+1+...+1)\),两个 ...
- BZOJ 1566 管道取珠(DP)
求方案数的平方之和.这个看起来很难解决.如果转化为求方案数的有序对的个数.那么就相当于求A和B同时取,最后序列一样的种数. 令dp[i][j][k]表示A在上管道取了i个,下管道取了j个,B在上管道取 ...
- 【题解】NOI2009管道取珠
又是艰难想题的一晚,又是做不出来的一题 (:д:) 好想哭啊…… 这题最关键的一点还是提供一种全新的想法.看到平方和这种东西,真的不好dp.然而我一直陷在化式子的泥潭中出不来.平方能够联想到什么?原本 ...
- BZOJ1566 [NOI2009]管道取珠 【dp】
题目 输入格式 第一行包含两个整数n, m,分别表示上下两个管道中球的数目. 第二行为一个AB字符串,长度为n,表示上管道中从左到右球的类型.其中A表示浅色球,B表示深色球. 第三行为一个AB字符串, ...
随机推荐
- DAY10-MYSQL数据类型
一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考: http://www.runoob.com/mysql/mysql-data ...
- 手动编译安装tmux
tmux的好处就不多说了,总之是多屏管理的神器.通常我们用系统通用的安装方式可以安装到tmux,但有时候,安装到的可能不是我们所需要的版本,又或者软件源里面没有带tmux.这个时候就需要手动编译安装了 ...
- Alert---点击拍照弹出对话框
/** * 照片对话框 *AlertDialog */ private void PhotoDialog() { AlertDialog.Builder builder = new Builder(m ...
- 关于mybatis和spring复合pom的异常
java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()L ...
- 安装nodemon热启动
1.安装: cnpm i nodemon -g 2.执行 nodemon .\launch.js .\config_preview\ .\launch.js 为我要启动的脚本文件 .\config_p ...
- cocos2d-js 热更新模块 使用AssetsManager
原帖子地址:http://cn.cocos2d-x.org/tutorial/show?id=1186 在这个文章中原作者已经说的很清楚,我在这个其他改动一些适用我项目中需求 1.满足Web和Nati ...
- ueditor 1.2.6使用方法
本文以php版本为例: 文件下载:http://ueditor.baidu.com/website/download.html 还可以自己先定义内容,然后下载,这样可以帮助我们精简不少东西. 以本地p ...
- MyBatis02 MyBatis基础知识之Mapper映射器
1 Mapper映射器是什么 是符合映射文件要求的接口 接口要求 a. 方法名要与sql的id一致. b. 方法的参数类型要与parameterType一致. c. 方法的返回类型要与resultTy ...
- linux环境启动django项目
BBS部署步骤 安装python3.6(如已安装无需重复) install python3.6 把BBS项目传上来 rz 选择文件 BBS.tar 解压文件 tar -xvf BBS.tar 安装my ...
- java全栈day33--html
本天要完成6个任务,并且布局静态页面(首页)详细分为六个部分 如下 网站信息页面案例(字体标签.排版标签) 网站图片信息页面案例(图片标签) 网站友情链接页面案例(列表标签) 网站首页案例(表格标签 ...