BZOJ 1566 管道取珠(DP)】的更多相关文章

求方案数的平方之和.这个看起来很难解决.如果转化为求方案数的有序对的个数.那么就相当于求A和B同时取,最后序列一样的种数. 令dp[i][j][k]表示A在上管道取了i个,下管道取了j个,B在上管道取了k个,下管道取了i+j-k个珠子的序列相同的种数. 那么状态转移方程显然可得. # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> # include…
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1566 Solution: 思路十分精奇的一道题目 题目要求的是$\sum_{i=1}^k a_i^2$ 明显发现$a_i$是难以求解的,于是考虑如何整体处理$a_i^2$ 由于$a_i^2=a_i*a_i$, 因此$a_i^2$可以认为是第一人选出的方案数$a_i$乘上第二人选出的方案数$a_i$ 那么只要统计两人选择相同序列的情况数即可 设dp[i][j][k]为取i个字符,两人在上…
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]了,因为二元组的个数是可以拆开来算的…
题目: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…
题目链接:管道取珠 这道题思路还是很巧妙的. 一开始我看着那个平方不知所措……看了题解后发现,这种问题有一类巧妙的转化.我们可以看成两个人来玩这个游戏,那么答案就是第二个人的每个方案在第一个人的所有方案中出现次数的和. 于是\(dp\)就显而易见了.\(f_{i,j,k}\)表示取了前\(i\)个,第一个人从上面拿了\(j\)个,第二个人从上面拿了\(k\)个的方案数. 还有这道题一开始读入的串翻不翻转无所谓.反正答案不会变. 大概以后碰到平方都能往这上面想想? 下面贴代码: #include<…
[BZOJ1566][NOI2009]管道取珠(动态规划) 题面 BZOJ 题解 蛤?只有两档部分分.一脸不爽.jpg 第一档?爆搜,这么显然,爆搜+状压最后统计一下就好了 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> using namespace std; #define ll long long #define…