OvO http://acm.hdu.edu.cn/showproblem.php?pid=6078

  (2017 Multi-University Training Contest - Team 4 - 1012)

  记f[i][j][k]为在s1中以第i位结尾,s2中以第j为结尾,末端状态(上升为1,下降为0)为k的子序列的个数

  则f[i][j][k]=∑f[p][q][1-k]  (p<i,q<j,而且新加入的点要使原序列结尾状态发生变化) 

  可见这是和矩阵差不多的东西

  可以把这个当做一个矩形,s1竖着,s2横着

  然后用类似前缀和的思想来优化 

  有2个数组用于优化

  fx[i][j][k]代表,状态k时,第1~i行,第j列的综合,即第j列的前缀。每当(i,j)处产生新方案的时候,都要往(i+1,j)处更新

  fy[i][j][k]比较特殊,代表状态k时,第i行第j列可行的方案数量,也就是可以直接用于(i,j)点更新的方案数量。

  fy的数组的更新的话

  1.对于同一行的fy[i][j][k]直接向后推至fy[i][j+1][k]处

  2.对于fx[i][j][k]中的方案,如果合法,则放入该行的fy[i][j+1][k]中。

    对于合法的判断,由于fx[i][j][k]中的方案,对于s2上的数,是以s2[j]结尾的,而当前这一行的要更新的点,对应的是s1[i]。也就是说根据k的值将两者比较就可以判断是否合法。

  维护这两个数组,如果当前点s1[i]==s2[j]就代表可以把fy中预备着的值(实质上是一个二维的前缀和)加入到答案中来。每次更新答案都会产生新的序列,要把这个序列的数量放到fx中。

  (思路来自csy的标程与题解)

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring> using namespace std; typedef long long ll; const int M=2044;
const ll mod=998244353; int n,m;
ll fx[M][M][2],fy[M][M][2];//if the tail of is up 1, otherwise 0
int s1[2222],s2[2222]; void init()
{
memset(fx,0,sizeof(fx));
memset(fy,0,sizeof(fy));
} void solve()
{
//regard it as a matrix
//s1 row ; s2 col
int i,j,k;
ll ans=0,tmp;
for(i=1;i<=n;i++) //row
for(j=1;j<=m;j++) //col
for(k=0;k<=1;k++)
{
if(s1[i]==s2[j]) //new seq
{
tmp=fy[i][j][1-k];
if(k)
tmp++;
if(tmp)
{
ans=(ans+tmp)%mod;
fx[i+1][j][k]=(fx[i+1][j][k]+tmp)%mod; //push up the num of new seq
}
} //fx push up
fx[i+1][j][k]=(fx[i+1][j][k]+fx[i][j][k])%mod;
if((k && s1[i]>s2[j]) || (!k && s1[i]<s2[j])) //if the fx have affect on this row
fy[i][j+1][k]=(fy[i][j+1][k]+fx[i][j][k])%mod; //fy push up
fy[i][j+1][k]=(fy[i][j+1][k]+fy[i][j][k])%mod;
}
cout<<ans<<endl;
} int main()
{
int T,i,j;
cin>>T;
while(T--)
{
init();
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&s1[i]);
for(i=1;i<=m;i++)
scanf("%d",&s2[i]);
solve();
}
return 0;
}

  

hdu 6078 Wavel Sequence的更多相关文章

  1. HDU 6078 - Wavel Sequence | 2017 Multi-University Training Contest 4

    /* HDU 6078 - Wavel Sequence [ DP ] | 2017 Multi-University Training Contest 4 题意: 给定 a[N], b[M] 要求满 ...

  2. HDU 6078 Wavel Sequence 树状数组优化DP

    Wavel Sequence Problem Description Have you ever seen the wave? It's a wonderful view of nature. Lit ...

  3. 2017 ACM暑期多校联合训练 - Team 4 1012 HDU 6078 Wavel Sequence (模拟)

    题目链接 Problem Description Have you ever seen the wave? It's a wonderful view of nature. Little Q is a ...

  4. 2017多校第4场 HDU 6078 Wavel Sequence DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6078 题意:求两个序列的公共波形子序列的个数. 解法: 类似于最长公共上升子序列,对于每个i,只考虑存 ...

  5. hdu6078 Wavel Sequence dp+二维树状数组

    //#pragma comment(linker, "/STACK:102400000,102400000") /** 题目:hdu6078 Wavel Sequence 链接:h ...

  6. HDU 5860 Death Sequence(死亡序列)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  7. HDU 1711 Number Sequence(数列)

    HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...

  8. HDU 1005 Number Sequence(数列)

    HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...

  9. HDU 5860 Death Sequence(递推)

    HDU 5860 Death Sequence(递推) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5860 Description You ...

随机推荐

  1. 第一章 Scala基础篇

    目录 一.Scala基础语法 (一) 变量.类型.操作符 1.变量申明 2.字符串 3.数据类型 4.操作符 (二)循环判断 1.块表达式 2.条件表达式 3.循环表达式 (三)方法和函数 1.方法 ...

  2. 牛客 158F 青蛙 (贪心)

    显然存在一个最优解满足所有青蛙在连续的一段, 每次由最左侧青蛙跳向下一格. 然后二分或者双指针即可求出答案. #include <iostream> #include <sstrea ...

  3. js页面加载时候的调用函数的方法

    方法一:jquery 中:$(function(){}) 括号内写你的内容 方法二:html <body onload=''> <script type="text/jav ...

  4. 【Day1】3.数据类型

     视频地址(全部) https://edu.csdn.net/course/detail/26057 课件地址(全部) https://download.csdn.net/download/gentl ...

  5. LVS (Linux虚拟服务器)-不同的负载均衡方法

    随着Internet用户的增长,基于Web的公司处理的通信量急剧增加.有各种解决方案来应对这种不断增长的流量. 一种解决方案是垂直扩展服务器(即:简单地向服务器添加更多的CPU和内存资源.)当然在一定 ...

  6. -bash: ls: No such file or directory 错误的原因及解决办法

    ubuntu出现如下错误: { Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.15.0-42-generic x86_64) * Documentation: ...

  7. 解决Chrome无法安装CRX离线插件

    解释说明: 谷歌浏览器Chrome,版本号67.0.3396.99,自这个版本后的Chrome,手动拖放插件文件crx到谷歌浏览器,这种安装插件的方式,一定会失败,它会提示“无法从该网站添加应用,扩展 ...

  8. oracle下关于table的常用sql整理

    创建表,create TABLE table( 列名称1 数据类型1, 列名称2 数据类型2, 列名称3 数据类型3, ......); eg: create table TABLE_24751( i ...

  9. 8.9.网络编程_Socket 远程调用机制

    1.网络编程 1.1.网络编程概述: 通过通信线路(有线或无线)可以把不同地理位置且相互独立的计算机连同其外部设备连接起来,组成计算机网络.在操作系统.网络管理软件及网络 通信协议的管理和协调下,可以 ...

  10. linux 计划任务超时控制和并发控制

    Linux crontab 的配置存放 /var/spool/cron 目录下. Linux crontab的日志文件存放再 /var/log/cron* timeout 命令 timeout 给脚本 ...