P1758-[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 仅包含一行,…
BZOJ 洛谷 考虑\(a_i^2\)有什么意义:两个人分别操作原序列,使得得到的输出序列都为\(i\)的方案数.\(\sum a_i^2\)就是两人得到的输出序列相同的方案数. \(f[i][j][k]\)表示第一个人上管道取到了第\(i\)个球,下管道取到了第\(j\)个球,第二个人上管道取到了第\(k\)个球,的方案数.转移很简单. 复杂度\(O(n^3)\). //2816kb 1072ms #include <cstdio> #include <algorithm> #d…
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1566 思路 n个球,第i个球颜色为ai,对于颜色j,对答案的贡献为颜色为j的球的个数的平方 k^2=(1+1+1+..+1)*(1+1++1+..+1) for (i=1; i<=n; i++) for (j=1; j<=n; j++) if (a[i]==a[j]) ans++; 感觉看起来还是有一丝丝领悟的 转化为两个人分别同时做游戏 取出相同的方案 \(f[i][a][b]\)…
---题面--- 思路: 主要难点在思路的转化, 不能看见要求$\sum{a[i]^2}$就想着求a[i], 我们可以对其进行某种意义上的拆分,即a[i]实际上可以代表什么? 假设我们现在有两种取出某一数列的方法,分别为X,Y.(X,Y可以相同) 那么这样的二元组有多少个呢? a[i]^2个. 因为X的取法有a[i]种,Y的取法也是a[i]种,所以二元组个数实际上就是a[i]^2. 那么这样一转化有什么好处? 方便DP 因为这样的话就不在需要知道具体的a[i]了,因为二元组的个数是可以拆开来算的…
luogu 这个题中的平方有点东西,考虑他的组合意义,也就是做这个过程两次,如果两次得到的结果一样就给答案+1,所以可以考虑dp,设\(f_{i,j,k,l}\)表示第一个过程中上面取到的第\(i\)个,下面取到第\(j\)个,第二个过程中上面取到的第$ k\(个,下面取到第\)l\(个的答案,转移枚举两个过程分别是取上面还是下面.容易发现\)i+j=k+l\(,所以可以改成\)f_{i,j,k}\(表示取了\)i\(次,第一个过程上面取到第\)j\(个,第二个过程上面取到第\)k$个的答案 #…
考虑这个式子的意义. 不妨看做进行了两轮操作,这个式子显然等价于两次操作后得到的序列相同的方案数. 这个东西显然是可以dp的. 随便优化一下就成了O(n^3)…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1566 一眼看上去很懵... 但是答案可以转化成有两个人在同时取珠子,他们取出来一样的方案数: f[i][j][k]表示一共取了 i 个珠子,第一个人取了 j 个珠子,第二个人取了 k 个珠子时一样的方案数: 于是就很好转移了: 这个转化的想法真妙啊... 代码如下: #include<iostream> #include<cstdio> #include<cstring…
1566: [NOI2009]管道取珠 Time Limit: 20 Sec  Memory Limit: 650 MBSubmit: 1659  Solved: 971 Description Input 第一行包含两个整数n, m,分别表示上下两个管道中球的数目. 第二行为一个AB字符串,长度为n,表示上管道中从左到右球的类型.其中A表示浅色球,B表示深色球. 第三行为一个AB字符串,长度为m,表示下管道中的情形. Output 仅包含一行,即为 Sigma(Ai^2) i从1到k 除以10…
原题链接 原题让求的是\(\sum\limits a_i^2\),这个东西直接求非常难求.我们考虑转化一下问题. 首先把\(a_i^2\)拆成\((1+1+...+1)(1+1+...+1)\),两个括号中的\(1\)都有\(a_i\)个.为什么要这样呢?仔细理解一下拆开后的式子,是不是就是相当于分别操作两次,问最终序列相同的方案数? 这样的话\(DP\)就比较好想了,设\(f[i][j][k][l]\)表示第一次操作上管道已经取了\(i\)个,下管道取了\(j\)个,第二次操作上管道取了\(k…
求方案数的平方之和.这个看起来很难解决.如果转化为求方案数的有序对的个数.那么就相当于求A和B同时取,最后序列一样的种数. 令dp[i][j][k]表示A在上管道取了i个,下管道取了j个,B在上管道取了k个,下管道取了i+j-k个珠子的序列相同的种数. 那么状态转移方程显然可得. # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> # include…
又是艰难想题的一晚,又是做不出来的一题 (:д:) 好想哭啊…… 这题最关键的一点还是提供一种全新的想法.看到平方和这种东西,真的不好dp.然而我一直陷在化式子的泥潭中出不来.平方能够联想到什么?原本的方案的乘积.将两部分相乘,我们能够联想到这是两个人在取珠,求他们取出来的珠子颜色序列相同的方案数之和.(第一个人要得到 \(x\) 这种颜色方案有\(a_{x}\)种,第二个人也一样.所以一共为 \({a_{x}}^{2}\) 种.到这里,应该就很容易了.虽然看了题解之后恍然大悟,然而深深地明白目…
题目 输入格式 第一行包含两个整数n, m,分别表示上下两个管道中球的数目. 第二行为一个AB字符串,长度为n,表示上管道中从左到右球的类型.其中A表示浅色球,B表示深色球. 第三行为一个AB字符串,长度为m,表示下管道中的情形. 输出格式 仅包含一行,即为 Sigma(Ai^2) i从1到k 除以1024523的余数. 输入样例 2 1 AB B 输出样例 5 提示 样例即为文中(图3).共有两种不同的输出序列形式,序列BAB有1种产生方式,而序列BBA有2种产生方式,因此答案为5. [大致数…
题意:给定两列球,可以从任意一列球的末尾弹出一个球,最后会得到一个序列,设第i种序列可以被a[i]种操作产生,那么会产生a[i]^2的贡献,求贡献和. Solution: 首先我们观察a[i]^2的含义,发现它是有a[i]种序列两两之间产生1的贡献. 于是我们就有了一个dp的思路,dp[i][j][k][l]表示一种序列为在第一列有i个,另一列有j个,另一种序列在第一列有k个,在第二列有l个.他们产生一样的输出序列的方案数. 转移就枚举一下一个弹什么. 因为i+j=k+l所以我们可以去掉一维,第…
Luogu1758 DarkBZOJ1566 题解 因为他要让我们求出每种状态出现次数的平方和,这样模拟两人取球的时候,设第一个人取球的方案为A,第二个人取球的方案为B, 这样对于每一个A,都有C(n + m , n)种B的方案与之对应,所以这样求出来正好是每种状态出现次数的平方和 所以方案数的平方和转化为选两次结果一样的方案数 我们用f[i][j][k][l]表示两个人同时取出了i+j个球,第一个人第1行取了i个球,第二行取了j个球,第二个人第1行取了k个球,第二行取了l个球 省掉一维,再用滚…
想不出来想不出来 仔细考虑平方的含义,我们可以把它想成两个人同时操作,最后得到相同序列的情况 然后就比较简单了,设f[t][i][j]为放了t个珠子,A的上方管道到了第i颗珠子,B的上方管道到了第j颗珠子的方案数,转移的话直接看下一步的珠子颜色是否相同即可 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const i…
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有…
--\(shallwe\):这道题是\(noipDay2T2\)难度 好一个\(Day2T2\)难度啊,我觉得我可以退役了 平方和好像没有什么办法可以快速统计,于是考虑转化一下 我们可以将题意转化成这样 求有序对\((A,B)\),取法\(A\)可以和取法\(B\)得到相同的结果 也就是可以将题目抽象成一个人进行这个游戏两遍,能得到同样结果的方案数是多少 之后我们可以设计出这样的\(dp\)方程,\(dp[i][j][k][p]\)表示第一次取从上面那个管道里取出了\(i\)个,从下面那个管道里…
https://www.lydsy.com/JudgeOnline/problem.php?id=1566 https://www.luogu.org/problemnew/show/P1758 题目见上. 这题听说是一个套路题啊…… 如果我让A玩一次游戏,B再玩一次,所得到的序列相同的情况和就正好是我们所求的答案. (比如说这款游戏有S种T序列,则A和B相同的次数显然为S*S正好就是题中给的式子.) 设f[i][j][k]为两人玩到了第i个珠子,A上管道拿了j个珠子,B上管道拿了k个珠子. 第…
Description Input第一行包含两个整数n, m,分别表示上下两个管道中球的数目. 第二行为一个AB字符串,长度为n,表示上管道中从左到右球的类型.其中A表示浅色球,B表示深色球. 第三行为一个AB字符串,长度为m,表示下管道中的情形.Output仅包含一行,即为 Sigma(Ai^2) i从1到k 除以1024523的余数.Sample Input2 1ABB Sample Output5HINT 样例即为文中(图3).共有两种不同的输出序列形式,序列BAB有1种产生方式,而序列B…
sum a[i]*a[i]可以理解为两个独立但同时进行的游戏得到同一个输出序列的方案数. 设f[l,i,j]为每个游戏都已经推出了l个珠子时,第一个游戏里上边儿的管道已经推出了i个,第二个游戏中上边儿管道推出了j个的方案数. 考虑到若要推出序列相同,那么对于每个阶段l,两个游戏的推出序列应始终相等.这样,跑跑计数dp就好了 #include <bits/stdc++.h> using namespace std; const int N=507; const int P=1024523; in…
题解 假如我们非常熟练的看出来,平方和转有序对统计的套路的话,应该就不难了 我们只需要统计(wayA,wayB)生成的序列一样的有序对个数就行 可以用一个\(n^3\)的dp解决 \(dp[i][j][k]\)表示选到第i个,第一个序列用j个上管道的球,第二个序列用了k的上管道的球,要求下一次操作两个球长得一样就可以了 代码 #include <iostream> #include <cstdio> #include <vector> #include <algo…
来自FallDream的博客,未经允许,请勿转载,谢谢. n<=500 神题...... 发现这个平方可以看作两个序列相同的对数  然后就可以表示状态了. f[i][j][k]表示两个序列各选了i个,第1个序列在第一行选了j个,第二个序列在第二行选了k个,他们相同的方案数 转移比较简单,枚举两个序列各填哪一位即可. 复杂度n^3 #include<iostream> #include<cstdio> #include<cstring> #define MN 500…
[NOI2009] 管道取珠 输入文件:ballb.in   输出文件:ballb.out   简单对比 时间限制:1 s   内存限制:512 MB #include <iostream> #include <cstring> #include <cstdio> using namespace std; ; ; char A[maxn],B[maxn]; int dp[maxn][maxn][maxn]; int n,m; int main(){ freopen(&q…
[BZOJ1566][NOI2009]管道取珠(动态规划) 题面 BZOJ 题解 蛤?只有两档部分分.一脸不爽.jpg 第一档?爆搜,这么显然,爆搜+状压最后统计一下就好了 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> using namespace std; #define ll long long #define…
题目链接:管道取珠 这道题思路还是很巧妙的. 一开始我看着那个平方不知所措……看了题解后发现,这种问题有一类巧妙的转化.我们可以看成两个人来玩这个游戏,那么答案就是第二个人的每个方案在第一个人的所有方案中出现次数的和. 于是\(dp\)就显而易见了.\(f_{i,j,k}\)表示取了前\(i\)个,第一个人从上面拿了\(j\)个,第二个人从上面拿了\(k\)个的方案数. 还有这道题一开始读入的串翻不翻转无所谓.反正答案不会变. 大概以后碰到平方都能往这上面想想? 下面贴代码: #include<…
题面 这是一道DP神题,直到我写下这句题解时也没有想明白…… 首先,这道题要我们求所有(不同输出序列的方案数)的平方和,于是我们当然就想到求所有不同输出序列的方案数……(大雾) .这道题一个巧妙的地方就在于对问题的转化.(以下摘自BYVoid大神的题解) 假设同时有两个人X & Y在玩这个游戏,设X从up取了i个珠子(不一定连续),从down取了j个珠子,取出来的珠子组成的序列为Q,操作序列为x,Y从up取了k个珠子,从down取了l个珠子,取出来的珠子组成的序列也为Q,操作序列为y,那么我们就…
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61891436 向大(hei)佬(e)势力学(di)习(tou) Description Input 第一行包含两个整数n, m,分别表示上下两个管道中球的数目. 第二行为一个AB字符串,长度为n,表示上管道中从左到右球的类型.其中A表示浅色球,B表示深色球. 第三行为一个AB字符串,长度为m,表示下管道中的情形. Output 仅包含一行,即为 Sigm…
正题 题目链接:https://www.luogu.com.cn/problem/P1758 题目大意 给出一个大小为\(n\)和一个大小为\(m\)的栈,每次选择一个栈弹出栈顶然后记录这个字母,求所有弹出序列的弹出方案的二次方和. \(1\leq n,m\leq 500\) 解题思路 二次方和可以看为取出方案相同的对数. 然后就是很简单的\(dp\)了,设\(f_{i,j,k}\)表示都取出了\(i\)个,在第一个栈里分开取了\(j/k\)个,然后滚动. 时间复杂度\(O(nmn^2)\) c…
题意: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个,第二个人从上…
题目链接:https://cn.vjudge.net/problem/HYSBZ-1566 题意 思路 已经说了,面对\sum a^2的时候把状态分两个, 当这两个状态相同时,满足题意的方案数即变为a^2 提交过程 WA 不知道为啥正着做dp总是WA AC 代码 #include <cstdio> #include <string> #include <cstring> #include <iostream> #include <algorithm&g…