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. D. Relatively Prime Graph

    Let's call an undirected graph G=(V,E)G=(V,E) relatively prime if and only if for each edge (v,u)∈E( ...

  2. 怎么把linux的磁盘映射到windows上

    步骤如下: 右击如下的computer: 然后选择:Map network drive... 然后在下图按图中所示操作: 最后成功如下图所示:

  3. Windows2008 – Task Scheduler – ‘Action “C:\Windows\SYSTEM32\cmd.exe” with return code 1’

    Remediation Edit Task Let us make the necessary changes, which is to specify the Start folder. Here ...

  4. [Python]安装完pip、pygame后,仍然import pygame报错

    按照<python编程从入门到实践>上的教程下载了pygame的whl文件进行安装, 在cmd窗口里import pygame提示无错误,在IDEL里程序也能正常运行, 但是pycharm ...

  5. RPC-Thrift(二)

    TTransport TTransport负责数据的传输,先看类结构图. 阻塞Server使用TServerSocket,它封装了ServerSocket实例,ServerSocket实例监听到客户端 ...

  6. DotNETCore 学习笔记 依赖注入和多环境

    Dependency Injection ------------------------------------------------------------------------ ASP.NE ...

  7. nginx启动脚本(class练习)

    说明:使用类的方式编写程序启动脚本(练习) 1 #!/usr/bin/env python import sys import os from subprocess import Popen,PIPE ...

  8. csrf_execmp

    参考;https://www.cnblogs.com/zhaof/p/6281482.html 全局: 中间件 django.middleware.csrf.CsrfViewMiddleware 局部 ...

  9. 在shell脚本中添加暂停,按任意键继续

    分析一个复杂脚本的时候,有时候需要加点暂停,分段来看,比较清晰 于是参考了一些实现,目前自己用的是这样子的 #add for debug by zqb function get_char() { SA ...

  10. git error: unable to write file xxx,git fatal: unable to write new index file

    执行git checkout -- . error: unable to write file mobile/manifest.jsonfatal: unable to write new index ...