1. Similar Subsequence
  2. Accepted : Submit :
  3. Time Limit : MS Memory Limit : KB
  4.  
  5. Similar Subsequence
  6.  
  7. For given sequence A=(a1,a2,…,an), a sequence S=(s1,s2,…,sn) has shape A if and only if:
  8.  
  9. si=min{si,si+,…,sn} for all ai=;
  10. si=max{si,si+,…,sn} for all ai=.
  11.  
  12. Given sequence B=(b1,b2,…,bm), Bobo would like to know the number of subsequences of length n which have shape A modulo (+).
  13. Input
  14.  
  15. The input contains zero or more test cases and is terminated by end-of-file. For each test case:
  16.  
  17. The first line contains two integers n and m.
  18.  
  19. The second line contains n integers a1,a2,…,an.
  20.  
  21. The thrid line contains m integers b1,b2,…,bm.
  22.  
  23. The number of test cases does not exceed .
  24. n
  25. m
  26. ai
  27. bim
  28. b1,b2,…,bm are distinct.
  29.  
  30. Output
  31.  
  32. For each case, output an integer which denotes the number of subsequences modulo (+).
  33. Sample Input
  34.  
  35. Sample Output
  36.  
  37. Note
  38.  
  39. For the first sample, all three subsequences of length are of shape A.
  40.  
  41. Source
  42. XTU OnlineJudge
  43.  
  44. /**
  45. 题目:Similar Subsequence
  46. 链接:http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1269
  47. 题意:给定A序列和B序列。A序列的数为0或1。
  48.  
  49. 从B中取出一个长度和A相同的子序列S满足
  50. si=min{si,si+1,…,sn} for all ai=0;
  51. si=max{si,si+1,…,sn} for all ai=1.
  52.  
  53. 问这样的S序列有多少种。结果mod 1e9+7;
  54. 个人分析过程:
  55. 显然要对A序列来处理。
  56. 假设最后一个是0,表明选的数,必须满足min{si,si+1,...,sn}。
  57. 那么如何确定B序列中的某个位置作为它。
  58. 最后一个数B序列任何位置皆可,无论a=0,1都可以满足min,max关系,因为只有它一个数。
  59. 倒数第二个数如何确认?
  60. 假设确定的最后一个数为x。
  61. an-1 = 0; 那么这个数要比x小。
  62. an-1 = 1; 那么这个数要比x大。
  63.  
  64. an-2 = 0; 那么这个数要比前面选过的数都小。
  65. an-2 = 1; 那么这个数要比前面选过的数都大。
  66. 1: sn-2>sn-1
  67. sn-1>x
  68. sn = x;
  69. sn-1<x
  70. 0: sn-2<sn-1
  71.  
  72. 维护当前选好的序列中的最大和最小。
  73. dp[i][j][k][flag]表示还要选i个数,当前选好的序列的最大值位置为j,最小值位置为k,
  74. 上一次选的位置为flag,flag=0表示为j位置,flag=1表示为k位置,的方法数。
  75. 因为:每次选了一个数后,位置一定是j或者k中的一个。
  76. if(a[i]==0){ 通过flag来判断上次的选的位置,然后向前枚举遍历找一个满足<a[k]的位置pos; dp[i][j][k][flag] += dfs(i-1,j,pos,1);}
  77. if(a[i]==1){ 通过flag来判断上次的选的位置,然后向前枚举遍历找一个满足>a[j]的位置pos; dp[i][j][k][flag] += dfs(i-1,pos,k,0);}
  78.  
  79. if(i==0) return 1;
  80.  
  81. 等一下:先试试对A序列从左到右考虑。
  82.  
  83. a1 = 0; 那么选择的第一个数为x必须满足B序列的x的右边比x大的数的集合为s,|s|>=n-1;
  84. a1 = 1; 那么选择的第一个数为x必须满足B序列的x的右边比x小的数的集合为s,|s|>=n-1;
  85.  
  86. a2 = 0;从前一个更新的集合s中,选择一个数,选择的x必须满足B序列的x的右边比x大的数的集合为s,|s|>=n-2;
  87.  
  88. a3 = ?; 同理。
  89.  
  90. 暂时不知怎么处理。
  91.  
  92. 再回去试试从右往左考虑A序列。
  93.  
  94. 正确思路:
  95. 在上面分析的基础上,由于时间超限了,对向前枚举遍历找一个满足<a[k]的位置pos;向前枚举遍历找一个满足>a[j]的位置pos;
  96. 这种操作优化一下。预处理mis[i]表示j<i, b[j]<b[i]的所有的j。mas[i]表示j<i, b[j]>b[i]的所有的j。
  97. 时间刚刚好卡过去了。。9000多ms。题目时限10s。
  98.  
  99. */
  100.  
  101. #include<bits/stdc++.h>
  102. using namespace std;
  103. typedef long long LL;
  104. typedef pair<int,int> P;
  105. const int maxn = 1e5+;
  106. const int mod = 1e9+;
  107. LL dp[][][][];
  108. vector<int> mis[];///mis[i]表示j<i, b[j]<b[i]的所有的j。
  109. vector<int> mas[505];///mas[i]表示j<i, b[j]>b[i]的所有的j。
  110. int n, m;
  111. int a[], b[];
  112. void init()
  113. {
  114. for(int i = ; i <= m; i++){
  115. mis[i].clear();
  116. mas[i].clear();
  117. }
  118. for(int i = ; i <= m; i++){
  119. for(int j = ; j < i; j++){
  120. if(b[j]<b[i]){
  121. mis[i].push_back(j);
  122. }
  123. if(b[j]>b[i]){
  124. mas[i].push_back(j);
  125. }
  126. }
  127. }
  128.  
  129. }
  130. LL dfs(int i,int j,int k,int flag)
  131. {
  132. if(i==) return ;
  133. LL &res = dp[i][j][k][flag];
  134. if(res!=-) return res;
  135. res = ;
  136. if(flag==){///j
  137. if(j-<i) return res = ;
  138. if(a[i]==){
  139. /// j 的前面 比b[k]小的数。j<k;
  140. int len = mis[k].size();
  141. for(int d = ; d < len; d++){
  142. if(mis[k][d]>=j) break;
  143. res = (res+dfs(i-,j,mis[k][d],))%mod;
  144. }
  145. }else
  146. {
  147. int len = mas[j].size();
  148. for(int d = ; d < len; d++){
  149. res = (res+dfs(i-,mas[j][d],k,))%mod;
  150. }
  151. }
  152. }else///k
  153. {
  154. if(k-<i) return res = ;
  155. if(a[i]==){
  156. int len = mis[k].size();
  157. for(int d = ; d < len; d++){
  158. res = (res+dfs(i-,j,mis[k][d],))%mod;
  159. }
  160. }else
  161. {
  162. int len = mas[j].size();
  163. for(int d = ; d < len; d++){
  164. if(mas[j][d]>=k) break;
  165. res = (res+dfs(i-,mas[j][d],k,))%mod;
  166. }
  167. }
  168. }
  169. return res;
  170. }
  171. int main()
  172. {
  173. while(scanf("%d%d",&n,&m)==)
  174. {
  175. for(int i = ; i <= n; i++) scanf("%d",&a[i]);
  176. for(int i = ; i <= m; i++) scanf("%d",&b[i]);
  177. init();
  178. memset(dp, -, sizeof dp);
  179. LL ans = ;
  180. for(int i = m; i >= n; i--){
  181. ans += dfs(n-,i,i,);
  182. ans %= mod;
  183. }
  184. printf("%I64d\n",ans%mod);
  185. }
  186. return ;
  187. }

2017-5-14 湘潭市赛 Similar Subsequence 分析+四维dp+一些简单优化的更多相关文章

  1. 模拟赛20181015 Uva1078 bfs+四维dp

    题意:一张网格图,多组数据,输入n,m,sx,sy,tx,ty大小,起终点 接下来共有2n-1行,奇数行有m-1个数,表示横向的边权,偶数行有m个数,表示纵向的边权 样例输入: 4  4  1  1  ...

  2. 「模拟赛20190327」 第二题 DP+决策单调性优化

    题目描述 小火车虽然很穷,但是他还是得送礼物给妹子,所以他前往了二次元寻找不需要钱的礼物. 小火车准备玩玩二次元的游戏,游戏当然是在一个二维网格中展开的,网格大小是\(n\times m\)的,某些格 ...

  3. Gitlab一键端的安装汉化及问题解决(2017/12/14目前版本为10.2.4)

    Gitlab的安装汉化及问题解决 一.前言 Gitlab需要安装的包太TM多了,源码安装能愁死个人,一直出错,后来发现几行命令就装的真是遇到的新大陆一样... ... 装完之后感觉太简单,加了汉化补丁 ...

  4. hdu6212[区间dp] 2017青岛ACM-ICPC网络赛

    原题: BZOJ1032 (原题数据有问题) /*hdu6212[区间dp] 2017青岛ACM-ICPC网络赛*/ #include <bits/stdc++.h> using name ...

  5. [徐州网络赛]Longest subsequence

    [徐州网络赛]Longest subsequence 可以分成两个部分,前面相同,然后下一个字符比对应位置上的大. 枚举这个位置 用序列自动机进行s字符串的下标转移 注意最后一个字符 #include ...

  6. 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视GCC编译全过程 | 百篇博客分析OpenHarmony源码| v57.01

    百篇博客系列篇.本篇为: v57.xx 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视编译全过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...

  7. 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位DP)

    2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位DP) 链接:https://ac.nowcoder.com/acm/contest/163/ ...

  8. HDU6578 2019HDU多校训练赛第一场 1001 (dp)

    HDU6578 2019HDU多校训练赛第一场 1001 (dp) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题意: 你有n个空需要去填,有 ...

  9. 2017-5-14 湘潭市赛 Longest Common Subsequence 想法题

    Longest Common Subsequence Accepted : Submit : Time Limit : MS Memory Limit : KB Longest Common Subs ...

随机推荐

  1. display:block什么时候使用

    所有的块级元素不需要再在使用display:block定义,块级元素本身的默认属性就是block display:block:比较常用于<a><span>这两个标签,因为他们不 ...

  2. React Native学习之自定义Navigator

    Navigator还是最常用的组件, 所以自己封装了一个, 使用起来也比较简单, 如下: 首先导入组件 var MLNavigator = require('../Lib/MLNavigator'); ...

  3. PHP图片的类型将其自动编码成base64

    <!--根据图片的类型将其自动编码成base64--><html><head><?php$file="test.jpg";$type=ge ...

  4. react使用echarts

    1.安装echarts: npm install echarts --save 2.制作线性图组件,只引入echart必要的js内容 /** * Created by yongyuehuang on ...

  5. scrapy-splash抓取动态数据例子九

    一.介绍 本例子用scrapy-splash抓取众视网网站给定关键字抓取咨询信息. 给定关键字:个性化:融合:电视 抓取信息内如下: 1.资讯标题 2.资讯链接 3.资讯时间 4.资讯来源 二.网站信 ...

  6. Python使用matplotlib绘制三维曲线

    本文主要演示如何使用matplotlib绘制三维图形 代码如下: # -*- coding: UTF-8 -*- import matplotlib as mpl from mpl_toolkits. ...

  7. IBM AppScan安全測试一例——已解密的登录请求

    问题严重级别:高 此类问题在做政府项目(第三方软件评測中心)验收的时,须要马上整改.例如以下图:

  8. ZOJ 3526 Weekend Party

    Weekend Party Time Limit: 2 Seconds      Memory Limit: 65536 KB As the only Oni (a kind of fabulous ...

  9. Win7如何自定义桌面右键菜单

    1 在注册表的HKEY_CLASSES_ROOT\DesktopBackground\Shell\位置,我们新建一个计算器,他的下面有一个项目command,然后这个command去打开计算器(通过分 ...

  10. pytz 格式化北京时间 6分钟问题

    使用datetime直接构造时间的时候,设置时区是没有北京时间的,一般来说习惯了linux的同志都会默认用上海时间来代替,这里却有一个问题,如果要进行时区转换,上海时间比北京时间差6分钟... 比如: ...