——\(shallwe\):这道题是\(noipDay2T2\)难度

好一个\(Day2T2\)难度啊,我觉得我可以退役了

平方和好像没有什么办法可以快速统计,于是考虑转化一下

我们可以将题意转化成这样

求有序对\((A,B)\),取法\(A\)可以和取法\(B\)得到相同的结果

也就是可以将题目抽象成一个人进行这个游戏两遍,能得到同样结果的方案数是多少

之后我们可以设计出这样的\(dp\)方程,\(dp[i][j][k][p]\)表示第一次取从上面那个管道里取出了\(i\)个,从下面那个管道里取出了\(j\)个,第二次从上面那个管道取出\(k\)个,从第二个管道里取出\(p\)个,得到的结果相同的方案数

结果相同肯定得取出的数量相同,所以\(i+j=k+p\),于是\(p\)那一维可以不要了

同时我们还可用滚掉一维,进一步优化空间

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define maxn 505
const int mod=1024523;
int n,m,o;
char A[maxn],B[maxn];
char a[maxn],b[maxn];
int dp[2][maxn][maxn];
inline int qm(int a,int b)
{
int t=a+b;
if(t>mod) return t-mod;
return t;
}
int main()
{
scanf("%d%d",&n,&m);
scanf("%s",A+1);
scanf("%s",B+1);
for(re int i=1;i<=n;i++) a[i]=A[n-i+1];
for(re int j=1;j<=m;j++) b[j]=B[m-j+1];
dp[0][0][0]=1;
for(re int i=0;i<=n;i++,o^=1)
for(re int j=0;j<=m;j++)
for(re int k=0;k<=n;k++)
{
int p=i+j-k;
if(p<0||p>m) continue;
if(a[i+1]==a[k+1]) dp[o^1][j][k+1]=qm(dp[o^1][j][k+1],dp[o][j][k]);
if(b[j+1]==b[p+1]) dp[o][j+1][k]=qm(dp[o][j+1][k],dp[o][j][k]);
if(a[i+1]==b[p+1]) dp[o^1][j][k]=qm(dp[o^1][j][k],dp[o][j][k]);
if(b[j+1]==a[k+1]) dp[o][j+1][k+1]=qm(dp[o][j+1][k+1],dp[o][j][k]);
dp[o][j][k]=0;
}
std::cout<<dp[o][m][n];
return 0;
}

【[NOI2009]管道取珠】的更多相关文章

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

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

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

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

  3. NOI2009 管道取珠 神仙DP

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

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

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

  5. 【题解】NOI2009管道取珠

    又是艰难想题的一晚,又是做不出来的一题 (:д:) 好想哭啊…… 这题最关键的一点还是提供一种全新的想法.看到平方和这种东西,真的不好dp.然而我一直陷在化式子的泥潭中出不来.平方能够联想到什么?原本 ...

  6. 1566: [NOI2009]管道取珠 - BZOJ

    Description Input第一行包含两个整数n, m,分别表示上下两个管道中球的数目. 第二行为一个AB字符串,长度为n,表示上管道中从左到右球的类型.其中A表示浅色球,B表示深色球. 第三行 ...

  7. bzoj 1566: [NOI2009]管道取珠

    Description   Input 第一行包含两个整数n, m,分别表示上下两个管道中球的数目. 第二行为一个AB字符串,长度为n,表示上管道中从左到右球的类型.其中A表示浅色球,B表示深色球. ...

  8. BZOJ1566 [NOI2009]管道取珠 【dp】

    题目 输入格式 第一行包含两个整数n, m,分别表示上下两个管道中球的数目. 第二行为一个AB字符串,长度为n,表示上管道中从左到右球的类型.其中A表示浅色球,B表示深色球. 第三行为一个AB字符串, ...

  9. [NOI2009] 管道取珠

    sum a[i]*a[i]可以理解为两个独立但同时进行的游戏得到同一个输出序列的方案数. 设f[l,i,j]为每个游戏都已经推出了l个珠子时,第一个游戏里上边儿的管道已经推出了i个,第二个游戏中上边儿 ...

随机推荐

  1. sdfsdfsdf

    i- i- i-1i- i- i- i- i- i-

  2. Vue2.0学习笔记:Vue事件修饰符的使用

    事件处理 如果需要在内联语句处理器中访问原生DOM事件.可以使用特殊变量$event,把它传入到methods中的方法中. 在Vue中,事件修饰符处理了许多DOM事件的细节,让我们不再需要花大量的时间 ...

  3. js 数组常用的一些方法

    数组可以说是js经常会遇到的数据结构,以下我们对数组进行详细的学习! 一.数组的创建 var mycars = new Array(): || new Array(3);  || new Array( ...

  4. 判定 java 对象死亡的过程

  5. 【C++并发实战】(二)线程管理

    前一篇没用markdown编辑器感觉不好看,删了重新发 本篇主要讲述线程的管理,主要包括创建和使用线程 启动线程 线程出现是为了执行任务,线程创建时会给一个入口函数,当这个函数返回时,该线程就会退出, ...

  6. java 简单计算器

    package com.direct.demo; import java.text.DecimalFormat; import java.util.Scanner; public class Calc ...

  7. Zookeeper + Guava loading cache 实现分布式缓存

    1. 概述 项目中,创建的活动内容存入redis,然后需要用到活动内容的地方,从redis去取,然后参与计算. 活动数据的一个特点是更新不频繁.数据量不大.因为项目部署一般是多机器.多实例,除了red ...

  8. Bootstrap网格

    首先了解一下,什么是网格? 在平面设计中,网格是一种由一系列用于组织内容的相交的直线(垂直的.水平的)组成的结构(通常是二维的).它广泛应用于打印设计中的设计布局和内容结构.在网页设计中,它是一种用于 ...

  9. css文本内容显示省略号

    文字显示省略号width: 4.5rem;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; 但是这个属性只支持单行文本的溢出显 ...

  10. React+antd 在限制高度内实现滚动显示多个组件(show scrolled components in a limited height with react antd)

    效果: 代码: import React from 'react'; import { Table } from 'antd'; import DatePicker1 from './DatePick ...