hdu 6078 Wavel Sequence
题
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的更多相关文章
- 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] 要求满 ...
- HDU 6078 Wavel Sequence 树状数组优化DP
Wavel Sequence Problem Description Have you ever seen the wave? It's a wonderful view of nature. Lit ...
- 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 ...
- 2017多校第4场 HDU 6078 Wavel Sequence DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6078 题意:求两个序列的公共波形子序列的个数. 解法: 类似于最长公共上升子序列,对于每个i,只考虑存 ...
- hdu6078 Wavel Sequence dp+二维树状数组
//#pragma comment(linker, "/STACK:102400000,102400000") /** 题目:hdu6078 Wavel Sequence 链接:h ...
- HDU 5860 Death Sequence(死亡序列)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- HDU 1711 Number Sequence(数列)
HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU 1005 Number Sequence(数列)
HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- HDU 5860 Death Sequence(递推)
HDU 5860 Death Sequence(递推) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5860 Description You ...
随机推荐
- SQL Server优化技巧——如何避免查询条件OR引起的性能问题
原文:SQL Server优化技巧--如何避免查询条件OR引起的性能问题 之前写过一篇博客"SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析",里面介绍了OR可能会引起 ...
- 为什么还需要应用层的Keepalive?
既然TCP有了keepalive,应用层还需要Keepalive多此一举吗? 显然是不是的,首先协议分层思想,每层的关注点不同,TCP属于传输层,关注“通”,应用层关注是否能“用”,能“通”不一定能“ ...
- type(),dir(),getattr(),hasattr(), isinstance()用法
1.type(变量) --->输出变量的类型int.float.str or others: 2.dir() ----> dir() 函数不带参数时,返回当前范围内的变量.方法和定义 ...
- 本地代码库,提交远程git
1.在git上新建项目,并填好相关信息 2.新建成功后,复制项目地址 3.idea新建本地仓库 4.Add所有文件,然后提交(commit) 5.先打开push界面,设置git远程地址,然后关掉,先p ...
- 并不对劲的复健训练-p3674
题目大意 给出序列$ a_1,...,a_n $ ( $ n\leq10^5,a\leq 10^5 $ ),有\(m\) ( \(m\leq 10^5\))个以下三类询问: (1)给出\(l,r,k\ ...
- Codeforces 1238D. AB-string
传送门 求合法的串看一眼很不可做 考虑一下总方案减去不合法方案 考虑如何求不合法的串,首先串中连续的相同字符一定是回文串的一部分 然后考虑 $AB$ 交错的情况,发现对于某个 $A$ 它如果左右都有 ...
- 使用kafka-eagle监控Kafka
# 监控kafka集群,开启监控趋势图使用 # 有一个问题,需要在kafka-server-start.sh文件中配置端口,有如下三种办法 # 第一种:复制并修改kafka目录,比如kafka-1,k ...
- 【spring Boot】spring boot获取资源文件的三种方式【两种情况下】
首先声明一点,springboot获取资源文件,需要看是 1>从spring boot默认的application.properties资源文件中获取 2>还是从自定义的资源文件中获取 带 ...
- Struts2 流程原理
一.流程图 (转) 二.流程详解 1.服务器传递来的请求,通过ActionContextClearUp.other filters.最后到达StrutsPrepareAndExecuteFilter ...
- WPF跨线程操作UI界面控件
在WPF应用中,如果遇到多线程的需求时,如果引用WPF控件时会引发异常,异常内容:调用线程无法访问此对象,因为另一个线程拥有该对象.具体如下: 调用代码: ThreadcountThread= ...