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] 管道取珠的更多相关文章

  1. BZOJ 1566 管道取珠(DP)

    求方案数的平方之和.这个看起来很难解决.如果转化为求方案数的有序对的个数.那么就相当于求A和B同时取,最后序列一样的种数. 令dp[i][j][k]表示A在上管道取了i个,下管道取了j个,B在上管道取 ...

  2. 【BZOJ 1566】 1566: [NOI2009]管道取珠 (DP)

    1566: [NOI2009]管道取珠 Time Limit: 20 Sec  Memory Limit: 650 MBSubmit: 1659  Solved: 971 Description In ...

  3. Bzoj 1566: [NOI2009]管道取珠(DP)

    1566: [NOI2009]管道取珠 Time Limit: 20 Sec Memory Limit: 650 MB Submit: 1558 Solved: 890 [Submit][Status ...

  4. BZOJ 1566 【NOI2009】 管道取珠

    题目链接:管道取珠 这道题思路还是很巧妙的. 一开始我看着那个平方不知所措……看了题解后发现,这种问题有一类巧妙的转化.我们可以看成两个人来玩这个游戏,那么答案就是第二个人的每个方案在第一个人的所有方 ...

  5. 【BZOJ1566】【NOI2009】管道取珠(动态规划)

    [BZOJ1566][NOI2009]管道取珠(动态规划) 题面 BZOJ 题解 蛤?只有两档部分分.一脸不爽.jpg 第一档?爆搜,这么显然,爆搜+状压最后统计一下就好了 #include<i ...

  6. 动态规划:NOI 2009 管道取珠

    [NOI2009] 管道取珠 输入文件:ballb.in   输出文件:ballb.out   简单对比 时间限制:1 s   内存限制:512 MB #include <iostream> ...

  7. BZOJ1566 【NOI2009】管道取珠

    题面 这是一道DP神题,直到我写下这句题解时也没有想明白…… 首先,这道题要我们求所有(不同输出序列的方案数)的平方和,于是我们当然就想到求所有不同输出序列的方案数……(大雾) .这道题一个巧妙的地方 ...

  8. BZOJ.1566.[NOI2009]管道取珠(DP 思路)

    BZOJ 洛谷 考虑\(a_i^2\)有什么意义:两个人分别操作原序列,使得得到的输出序列都为\(i\)的方案数.\(\sum a_i^2\)就是两人得到的输出序列相同的方案数. \(f[i][j][ ...

  9. NOI2009 管道取珠 神仙DP

    原题链接 原题让求的是\(\sum\limits a_i^2\),这个东西直接求非常难求.我们考虑转化一下问题. 首先把\(a_i^2\)拆成\((1+1+...+1)(1+1+...+1)\),两个 ...

随机推荐

  1. COGS1752. [BOI2007]摩基亚Mokia CDQ

    CDQ的板子题 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...

  2. java Collections.sort()实现List排序的默认方法和自定义方法【转】

    1.java提供的默认list排序方法 主要代码: List<String> list = new ArrayList();list.add("刘媛媛"); list. ...

  3. 使用babel把es6代码转成es5代码

    第一步:创建一个web项目 使用命令:npm init 这个命令的目的是生成package.json. 执行第二步中的命令后生成的package.json的文件的内容是: { "name&q ...

  4. 使用e.target.dataset的问题

    在微信开发中我们经常会用到标签中属性的属性值,有时候我们通过 data-* 和 e.target.dateset 来获取属性值会出现一点小bug,即是调用出来的数据是undefined. 1)方案1– ...

  5. 搭建eova开发环境

    1.安装好maven 2.下载Eova项目解压到文件夹eova下 3.dos命令到eova文件夹下执行mvn eclipse:eclipse(注:构建eclipse项目命令) 4.修改*.tag文件错 ...

  6. 转:Spring AOP 注解方式实现的一些“坑”

    使用过Spring AOP的注解方式实现,也入过不少坑,现在做一下记录,希望有同样需求的朋友可以少走弯路 使用之前还是先过一下官方文档吧,至少可以少走弯路,不用担心英文读不懂,其实只看代码例子就能理解 ...

  7. 【BZOJ3942】Censoring [KMP]

    Censoring Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 有一个S串和一个T串,长 ...

  8. DDD——让天下没有难调的程序

    https://www.linuxidc.com/Linux/2016-11/137343.htm DDD全称Data Display Debugger,当我第一次见到它时,它的界面着实让我吃了一惊, ...

  9. UVA 10471 Gift Exchanging

    题意:就5种盒子,给出每个盒子个数,盒子总数,每个人选择这个盒子的概率.求这个人选择哪个盒子取得第一个朋友的概率最大,最大多少 dp[N][sta]表示当前第N个人面临状态sta(选择盒子的状态可以用 ...

  10. windows使用celery遇到的错误

    https://www.jianshu.com/p/e5539d96641c 按照这个教程一步步执行到最后报错了. 运行task_dispatcher.py的时候 ValueError: not en ...