题目链接

题目翻译:

给出长度为n的序列a,

给出长度为m的序列b.

挑选一些下标f,

挑选一些下表g,

并且这两组下标都是升序排列的。

然后在选出Af == Bg,这些数,组成题目中所要求的波浪,求组成符合题目要求的波浪的序列数,最后答案模上一个数。

题目波浪的形式是:波谷,波峰,波谷,波峰。。。。。。所以波浪开头必须要是波谷。

动态规划题目,我的动态规律狠狠狠渣,现在还是个迷糊蛋。

设置dp[i][j][2].

dp[i][j][0] 以a[i],b[i]为结尾且作为波谷的方案数。

dp[i][j][1] 以a[i],b[i]为结尾且作为波峰的方案数。

由于每次可以固定序列a中的一个数,然后遍历整个b,序列,因此可以把三维的dp优化成二维,

dp[j][2]. 因为a[i]每次固定,则二维dp已经默认第一维就是a[i].

sum[j][0]代表以a[i],b[i]为结尾的且作为波谷的方案的总数。

sum[j][1]代表以a[i],b[i]为结尾的且作为波峰的方案的总数。

固定当前a[i]。与序列中的各个值比较。

如果a[i] == b[j] ,则,把a[i]作为波峰,波谷的方案数直接给dp[j][1]和dp[j][0],就可以了。这些方案数是由下面

的操作统计而来的。

如果a[i] > b[j]。因为固定a[i]的时候,我们是从a数组从前往后遍历的,那么a数组中的前i-1个数,已经

完成了与b数组中各个数字的比较,只要前数组a中前i-1个有与b[j]相等的数,假如这个数为a[k] {1<=k<i},

则一定已经存在以a[k],b[j]为结尾作为波峰和波谷的方案了,由于当前a[i]>b[j],则a[i]对于b[j]来说,只能

做波峰,继续往后比较如果存在b[t]==a[i] (j<t<=m),那么a[i]就可以加在b[j]作为波谷结尾的后面,做波峰,

则,a[i]做波峰的方案数,就应该在加上b[j]做为波谷的方案数。

同理a[i] < b[j]的时候,a[i]就可以做为波谷,则a[i]左为波谷的方案数,需要加上b[j]作为波峰结尾的方案数。

AC代码:

#include <iostream>
#include <stdio.h>
#include <string.h>using namespace std;const int mod = 998244353;
const int maxn = 2010;
int sa[maxn];     ///序列a
int sb[maxn];     ///序列b
int dp[maxn][2];
///dp[i][j][0]代表以a[i],b[j]为结尾,作为波谷的方案数,dp[i][j][1]代表以a[i],b[j]为结尾,作为波峰的方案数。
///因为可以每次固定a[i],然后遍历b数组,这样的话,就自动默认第一维,可以把上面的数组变成二维的。
int sum[maxn][2];
///sum[i][j][0]代表当前以a[i],b[j]结尾作为波谷的总方案数,sum[i][j][1]代表当前以a[i],b[j]结尾作为波峰的总方案数
int main()
{int t,n,m;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(int i = 1; i <= n; i++)scanf("%d",&sa[i]);for(int i = 1; i <= m; i++)scanf("%d",&sb[i]);memset(dp,0,sizeof(dp));memset(sum,0,sizeof(sum));long long ans = 0;for(int i = 1; i <= n; i++){int waveBottom = 1,waveTop = 0;/**wavebottom为波谷,wavetop为波峰,由于题目说了波浪是从波谷开始的,所以只要单独的一列序列是一定能做波谷的,所以波谷初始化1.**/for(int j = 1; j <= m; j++)  ///每次固定sa[i],遍历sequence b。{dp[j][0] = dp[j][1] = 0;if(sa[i]==sb[j])  ///两个序列的相同的数值,才能做波峰和波谷{dp[j][0] = waveBottom;dp[j][1] = waveTop;ans = (ans + waveBottom + waveTop)%mod;}else if(sa[i]<sb[j]){waveBottom = (waveBottom + sum[j][1])%mod;}else  ///sa[i]>sb[j],sa[i]可以作为以sb[j]为波谷结尾的序列的波峰{waveTop = (waveTop + sum[j][0])%mod;}}///更新以a[i],b[j]作为波峰波谷结尾的总方案数for(int j = 1; j <= m; j++){if(sa[i] == sb[j]){sum[j][0] = (sum[j][0] + dp[j][0])%mod;sum[j][1] = (sum[j][1] + dp[j][1])%mod;}}}printf("%lld\n",ans);}return 0;
}

2017 Multi-University Training Contest - Team 4 :Wavel Sequence相关推荐

  1. 2017 Multi-University Training Contest - Team 3 Kanade's sum hd6058

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6058 题目: Kanade's sum Time Limit: 4000/2000 MS (J ...

  2. 2017 Multi-University Training Contest - Team 1

    2017 Multi-University Training Contest - Team 1 01     签到的 #include<bits/stdc++.h> using names ...

  3. 2017 Multi-University Training Contest - Team 7:1003. Color the chessboard(...)

    其他题目题解: 2017 Multi-University Training Contest - Team 7:1005. Euler theorem 2017 Multi-University Tr ...

  4. 2017 Multi-University Training Contest - Team 7:1002. Build a tree(递归)

    其他题目题解: 2017 Multi-University Training Contest - Team 7:1005. Euler theorem 2017 Multi-University Tr ...

  5. 2017 Multi-University Training Contest - Team 7:1010. Just do it(组合数?)

    其他题目题解: 2017 Multi-University Training Contest - Team 7:1005. Euler theorem 2017 Multi-University Tr ...

  6. 2017 Multi-University Training Contest - Team 7:1008. Hard challenge(模拟)

    其他题目题解: 2017 Multi-University Training Contest - Team 7:1005. Euler theorem 2017 Multi-University Tr ...

  7. 2017 Multi-University Training Contest - Team 7:1011. Kolakoski(模拟)

    其他题目题解: 2017 Multi-University Training Contest - Team 7:1005. Euler theorem 2017 Multi-University Tr ...

  8. 2017 Multi-University Training Contest - Team 7:1005. Euler theorem(答案是(n+3)/2)

    其他题目题解: 2017 Multi-University Training Contest - Team 7:1003. Color the chessboard 2017 Multi-Univer ...

  9. 2017 Multi-University Training Contest - Team 2 Puzzle

    题目大意: 给定n, m, p.然后按照一个规则往n*m的方格里填数,最后一个方格是空格,然后玩拼图游戏,问能否复原 规则是:把1~n*m-1的排列中的第1,p+1,2*p+1.....个数依次取出来 ...

最新文章

  1. 利用OnAnimatorove函数控制人物的移动
  2. 2021年全新各方向IT职业技能图谱
  3. Flot使用文档(转)
  4. Spring Cloud构建微服务架构:消息驱动的微服务(入门)【Dalston版】
  5. π里包含了所有可能的数字组合吗?
  6. PHP操作常见的错误
  7. 限制mysql资源使用率_MySQL--限制用户使用资源
  8. 微博爬虫思路:Python通过移动端接口爬取,简单易操作
  9. 老师常用选择题,选择框,单选框,以及各行业产品配置表单选配置明细等
  10. mysql skip-grant-tables my.cnf_使用SKIP-GRANT-TABLES解决MYSQLROOT密码丢失
  11. SSD固态硬盘重装win10系统 无法分区,gpt格式
  12. 施柏阁保时捷设计酒店全球陆续开设15家酒店;汉庭新品旗舰店在武汉街道口商圈亮相;开元酒店用国潮赋能中高端品牌 | 全球旅报...
  13. amap不同样式marker点_高德地图markers生成和点击
  14. droid3 flash
  15. 标号法求解单源最短路径
  16. 解决机械+固态的电脑无法安装window10系统的问题
  17. 酒馆指南:小白开店必备
  18. Python-Flask开发微电影网站(四)
  19. document.execCommand(undo, false, null);是什么意思
  20. 安卓通讯录管理软件_细说|安卓系统50个你不知道的使用窍门!每个都值得你去收藏!...

热门文章

  1. c语言json库如何编译,C语言的JSON库Jansson
  2. Buy and Resell
  3. 【微信小程序】-- 自定义组件 - 数据监听器 (三十四)
  4. Alienware M11x R2 退居二线,家人工作用机
  5. 计算机和运筹学就业方向,运筹学与控制论专业就业方向
  6. VMware 安装WIN10 WIN7
  7. php百度网盘登录,php登陆状态百度网盘获取文件下载链接【思路|部分代码】
  8. THREE将左键改为平移右键改为旋转
  9. 【杂谈】打工人如何喝一杯精致健康的咖啡
  10. 随身WiFi刷debian固件