D Game

HDU - 5693

众所周知,度度熊喜欢的字符只有两个:B 和D。

今天,它发明了一个游戏:D游戏。

度度熊的英文并不是很高明,所以这里的D,没什么高深的含义,只是代指等差数列[(等差数列百科)](http://baike.baidu.com/view/62268.htm)中的公差D。

这个游戏是这样的,首先度度熊拥有一个公差集合$\{D\}$,然后它依次写下$N$个数字排成一行。游戏规则很简单:

1. 在当前剩下的有序数组中选择$X (X \geq 2)$ 个连续数字;

2. 检查$1$选择的$X$个数字是否构成等差数列,且公差 $d\in \{D\}$;

3. 如果$2$满足,可以在数组中删除这$X$个数字;

4. 重复 $1 - 3$ 步,直到无法删除更多数字。

度度熊最多能删掉多少个数字,如果它足够聪明的话?

Input第一行一个整数$T$,表示$T(1 \leq T \leq 100)$ 组数据。

每组数据以两个整数 $N$,$M$ 开始 。接着的一行包括 $N$ 个整数,表示排成一行的有序数组 $A_{i}$。接下来的一行是 $M$ 个整数,即给定的公差集合 $D_{i}$。

$1 \leq N, M \leq 300$

$-1\ 000\ 000\ 000 \leq A_{i}, D_{i} \leq 1\ 000\ 000\ 000$ 
Output对于每组数据,输出最多能删掉的数字 。Sample Input

3
3 1
1 2 3
1
3 2
1 2 4
1 2
4 2
1 3 4 3
1 2

Sample Output

3
2
4
/*
每删除一段区间,假设区间长度为len,那么len一定能表示成2*i+3*j的形式,也就是每次可以只删除长度为2或3的长度即可
过程分两步:
1.先处理出f[i][j]=1/0,代表区间[i,j]能否全部删除,首先枚举一个中间点k,能由三种情况转移过来:
①如果[i,k]和[k+1,j]能被删除,那么[l,r]一定能被删除
②如果[i+1,k]和[k+1,r-1]能被删除并且a[i]和a[j]能被删除,那么[l,r]一定能被删除
③如果[i+1,k-1]和[k+1,r-1]能被删除并且a[i],a[k],a[j]能被删除,那么[l,r]一定能被删除
2.dp[i]表示到第i位最多能删除的数字个数,用f[][]转移即可
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#define maxn 310
using namespace std;
int n,m,T,a[maxn],dp[maxn];
bool f[maxn][maxn];
map<int,int>mark;
void work1(){
for(int i=;i<=n;i++)if(mark[a[i]-a[i-]])f[i-][i]=;
for(int i=;i<=n;i++)if(a[i-]-a[i-]==a[i]-a[i-]&&mark[a[i]-a[i-]])f[i-][i]=;
for(int len=;len<=n;len++)
for(int i=;i+len-<=n;i++){
int j=i+len-;
for(int k=i+;k<j;k++)f[i][j]|=(f[i][k]&f[k+][j]);
if(mark[a[j]-a[i]])f[i][j]|=f[i+][j-];
for(int k=i+;k<j;k++)
if(a[j]-a[k]==a[k]-a[i]&&mark[a[k]-a[i]])
f[i][j]|=f[i+][k-]&f[k+][j-];
}
}
void work2(){
for(int i=;i<=n;i++){
dp[i]=dp[i-];
for(int j=;j<=i;j++){
if(!f[j][i])continue;
dp[i]=max(dp[i],dp[j-]+i-j+);
}
}
}
int main(){
freopen("Cola.txt","r",stdin);
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
mark.clear();
memset(f,,sizeof(f));
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++)scanf("%d",&a[i]);
int x;
for(int i=;i<=m;i++){
scanf("%d",&x);
mark[x]=;
}
work1();
work2();
printf("%d\n",dp[n]);
}
}

hdu 5693 D Game的更多相关文章

  1. hdu 5693 && LightOj 1422 区间DP

    hdu 5693 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5693 等差数列当划分细了后只用比较2个或者3个数就可以了,因为大于3的数都可以由2和3 ...

  2. HDU 5693 D Game 区间dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5693 题解: 一种朴实的想法是枚举选择可以删除的两个或三个数(其他的大于三的数都能凑成2和3的和), ...

  3. hdu 5693 朋友 博弈

    朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Descr ...

  4. HDU 5694---BD String

    HDU   5694 Problem Description 众所周知,度度熊喜欢的字符只有两个:B和D.今天,它发明了一种用B和D组成字符串的规则:S(1)=BS(2)=BBDS(3)=BBDBBD ...

  5. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  7. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  8. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  9. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

随机推荐

  1. Hibernate - 配置c3p0

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuratio ...

  2. performance.timing检测页面加载速度

    with(performance){ readyStart = timing.fetchStart - timing.navigationStart; redirectTime = timing.re ...

  3. CMake简易入门

    使用CMake编译 CMake工具用于生成Makefile文件.用户通过编写CMakeLists.txt文件,描述构建过程(编译.连接.测试.打包),之后通过解析该文件,生成目标平台的Makefile ...

  4. Ffmpeg转码研究一

    Ffmpeg是一款功能强大的视频处理工具,那么转码肯定不是问题的,因为项目的需求,对转码进行了研究.刚开始首先去看了ffmpeg源代码中的一个例子transcode.c,但是发现该例子更应该称之为re ...

  5. Agc012_E Camel and Oases

    传送门 题目大意 坐标轴上有$n$个坐标,第$i$个坐标是$x_i$,初始你有一个容量$V$,当两个给定的坐标距离不超过$V$时,你可以从一个坐标到达另一个坐标,同时你还可以令$V=\lfloor \ ...

  6. POJ-1564 dfs

    #include"cstring" #include"cstdio" +; int nux[maxn]; int nua[maxn];//解的集合 int t; ...

  7. google android sdk下载hoosts

    203.208.46.146 www.google.com #这行是为了方便打开Android开发官网 现在好像不VPN也可以打开 74.125.113.121 developer.android.c ...

  8. 使用 Anthem.NET 框架的一个调试经历

    简介:Anthem 是一个很好用的 Ajax 框架,支持 ASP.NET 1.1, 2.0.由于该框架的所有控件都继承自 ASP.NET 自身的服务器控件,保留了几乎所有这些控件的属性和行为(除了把它 ...

  9. Maven(2)-坐标和依赖

    本文简要介绍Maven里面的坐标(coodinate)以及maven依赖管理(Dependency) 一.坐标 先来个截图: 在上图peoject栏目有groupId,artifactId,versi ...

  10. bzoj 2648 SJY摆棋子——KDtree

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2648 第一道KDtree! 学习资料:https://blog.csdn.net/zhl30 ...