[BZOJ 1566] 管道取珠
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个字符,两人在上方取到j,k个字符时相同的方案数
接下来再用滚动数组优化下转移就好了
Code:
//by NewErA
#include <bits/stdc++.h> using namespace std;
const int MOD=; const int MAXN=; int n,m,dp[][MAXN][MAXN],up[MAXN],down[MAXN],t=;
char s1[MAXN],s2[MAXN]; int main()
{
scanf("%d%d",&n,&m);
scanf("%s",s1);scanf("%s",s2);
for (int i=;i<n;i++)
up[n-i]=s1[i]-'A';
for (int i=;i<m;i++)
down[m-i]=s2[i]-'A';
dp[][][]=;
for(int i=;i<n+m;i++,t^=)
for(int j=;j<=min(n,i);j++)
for(int k=;k<=min(n,i);k++)
if(dp[t][j][k])
{
int temp=dp[t][j][k];
if(j<n && k<n && up[j+]==up[k+]) (dp[t^][j+][k+]+=temp)%=MOD;
if(j<n && i-k<m && up[j+]==down[i-k+]) (dp[t^][j+][k]+=temp)%=MOD;
if(i-j<m && k<n && down[i-j+]==up[k+]) (dp[t^][j][k+]+=temp)%=MOD;
if(i-j<m && i-k<m && down[i-j+]==down[i-k+]) (dp[t^][j][k]+=temp)%=MOD;
dp[t][j][k]=;
}
cout << dp[t][n][n];
return ;
}
Review:
1、如果要求解某难以求解之数的多次幂时,
考虑将多次幂转化为降次的其它问题求解
(二次幂转化为两个一次问题的结果相乘)
2、对DP的优化:
如果为同时求解两个同样问题的DP,维护步数和即可,由$O(n^4)$降到$O(n^3)$
如果每次只用到上一层结果,使用滚动数组优化空间
[BZOJ 1566] 管道取珠的更多相关文章
- BZOJ 1566 管道取珠(DP)
求方案数的平方之和.这个看起来很难解决.如果转化为求方案数的有序对的个数.那么就相当于求A和B同时取,最后序列一样的种数. 令dp[i][j][k]表示A在上管道取了i个,下管道取了j个,B在上管道取 ...
- 【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 ...
- BZOJ 1566 【NOI2009】 管道取珠
题目链接:管道取珠 这道题思路还是很巧妙的. 一开始我看着那个平方不知所措……看了题解后发现,这种问题有一类巧妙的转化.我们可以看成两个人来玩这个游戏,那么答案就是第二个人的每个方案在第一个人的所有方 ...
- 【BZOJ1566】【NOI2009】管道取珠(动态规划)
[BZOJ1566][NOI2009]管道取珠(动态规划) 题面 BZOJ 题解 蛤?只有两档部分分.一脸不爽.jpg 第一档?爆搜,这么显然,爆搜+状压最后统计一下就好了 #include<i ...
- 动态规划:NOI 2009 管道取珠
[NOI2009] 管道取珠 输入文件:ballb.in 输出文件:ballb.out 简单对比 时间限制:1 s 内存限制:512 MB #include <iostream> ...
- BZOJ1566 【NOI2009】管道取珠
题面 这是一道DP神题,直到我写下这句题解时也没有想明白…… 首先,这道题要我们求所有(不同输出序列的方案数)的平方和,于是我们当然就想到求所有不同输出序列的方案数……(大雾) .这道题一个巧妙的地方 ...
- BZOJ.1566.[NOI2009]管道取珠(DP 思路)
BZOJ 洛谷 考虑\(a_i^2\)有什么意义:两个人分别操作原序列,使得得到的输出序列都为\(i\)的方案数.\(\sum a_i^2\)就是两人得到的输出序列相同的方案数. \(f[i][j][ ...
- NOI2009 管道取珠 神仙DP
原题链接 原题让求的是\(\sum\limits a_i^2\),这个东西直接求非常难求.我们考虑转化一下问题. 首先把\(a_i^2\)拆成\((1+1+...+1)(1+1+...+1)\),两个 ...
随机推荐
- [AHOI2005]航线规划——LCT维护边双联通分量
因为只能支持加入一个边维护边双,所以时光倒流 维护好边双,每次就是提取出(x,y)的链,答案就是链长度-1 具体维护边双的话, void access(int x){ for(reg y=0;x;y= ...
- js用for of 遍历数组
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- jquery和ajax,json写法的说明
一: 在ajax中,如果没有用jquery,则如xmlHttpRequest.open("POST", "AjaxServlet", true); (1)如果用 ...
- HDU2157 How many ways??---(邻接矩阵,图论,矩阵快速幂)
http://acm.hdu.edu.cn/showproblem.php?pid=2157 How many ways?? Time Limit: 2000/1000 MS (Java/Others ...
- CF502C The Phone Number
C. The Phone Number time limit per test 1 second memory limit per test 256 megabytes Mrs. Smith ...
- IOS开发代码分享之获取启动画面图片的string
http://www.jb51.net/article/55309.htm 本代码支持 iPhone 6 以下. 支持 iPhone 及 iPad ? 1 2 3 4 5 6 7 8 9 10 11 ...
- UVALIVE 4330 Timer
Description Recently, some archaeologists discovered an ancient relic on a small island in the Pac ...
- 内核中的多点触摸协议文档 Multi【转】
转自:http://www.arm9home.net/read.php?tid=24754 前段时间改写了一个GT801的内核驱动,仔细阅读 MT Event 上报的时候,发现这个驱动是针对 Andr ...
- 抽象语法树简介(ZZ)
转载自: http://www.cnblogs.com/cxihu/p/5836744.html (一)简介 抽象语法树(abstract syntax code,AST)是源代码的抽象语法结构的树状 ...
- poj 2242(已知三点求外接圆周长)
The Circumference of the Circle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8310 ...