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. Backup and Restore MySQL Database using mysqlhotcopy

    mysqlhotcopy is a perl script that comes with MySQL installation. This locks the table, flush the ta ...

  2. 封装常用的Javascript跨浏览器方法

    var EventUntil={ // 跨浏览器的添加事件方法 addHandler:function(element,type,handler){ if(element.addEventListen ...

  3. Hibernate中inverse、cascade的说明

    一: 前沿:刚刚学习hibernate时,对于inverse很是纠结,不知道什么时候该用什么时候不该用,在网上找了一些资料,说的也很含糊,我都不知道如果写了"inverse=true&quo ...

  4. Idea IntelliJ远程调试教程

    总结 第一步:修改startup.sh 在倒第二行加上export JPDA_ADDRESS=8787 最后一行在start前面加上"   jpda   " 第二步:配置Idea, ...

  5. compositionstart 、 compositionend 、 input都存在时的解决办法

    $(function () { var cpLock = true; $('#textbox').off().on({ compositionstart: function () {//中文输入开始 ...

  6. Linux的yum命令——(八)

    Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基于RPM包管理,能够从指定的服务器自动下载 ...

  7. Linux eject弹出光驱

    Linux eject命令用于退出抽取式设备. 若设备已挂入,则eject会先将该设备卸除再退出. 语法 eject [-dfhnqrstv][-a <开关>][-c <光驱编号&g ...

  8. ubuntu设置默认python版本

    原文:https://www.cnblogs.com/johnny1024/p/8400511.html ··· ubuntu 16.04本身是自带python的,他本身是自带2.X和3.X,两个版本 ...

  9. mysql五:数据操作

    一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...

  10. C# 获取存在DataTable1不存在DataTable2的数据的快速方法

    通过合并和获得改变两个方法获得差异的部分: dataTable1.AcceptChanges();dataTable1.Merge(dataTable2);DataTable changesTable ...