D Game

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 905    Accepted Submission(s): 324

Problem Description
众所周知,度度熊喜欢的字符只有两个:B 和D。
今天,它发明了一个游戏:D游戏。
度度熊的英文并不是很高明,所以这里的D,没什么高深的含义,只是代指等差数列[(等差数列百科)](http://baike.baidu.com/view/62268.htm)中的公差D。
这个游戏是这样的,首先度度熊拥有一个公差集合{D},然后它依次写下N个数字排成一行。游戏规则很简单:
1. 在当前剩下的有序数组中选择X(X≥2) 个连续数字;
2. 检查1选择的X个数字是否构成等差数列,且公差 d∈{D};
3. 如果2满足,可以在数组中删除这X个数字;
4. 重复 1−3 步,直到无法删除更多数字。
度度熊最多能删掉多少个数字,如果它足够聪明的话?
Input
第一行一个整数T,表示T(1≤T≤100) 组数据。
每组数据以两个整数 N,M 开始 。接着的一行包括 N 个整数,表示排成一行的有序数组 Ai。接下来的一行是 M 个整数,即给定的公差集合 Di。
1≤N,M≤300
−1 000 000 000≤Ai,Di≤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
Source
分析:挺好的一道题.
   删数,区间会变动,支持O(n^3)的做法,很显然,这就是一道区间dp题.如果直接设状态f[i][j]表示区间[i,j]最多能删多少个数,不好转移,不知道剩下还有哪些数能够删.
   把最优性问题转化成判断可行性问题. 令f[i][j]表示区间[i,j]的数能不能被删光. 有一个结论:每次删数只需要删2个或者3个.为什么可以这样呢?如果一次删的数的个数>3个,那么完全可以把它们拆成2个和3个地去删.可以利用这个结论来进行转移.
   区间[i,j]有两种可能的情况:1.i和j被删了.  2.i和j没有被删.
   对于第一种情况,枚举一个k,如果f[i][k] = f[k + 1][j] = 1,那么f[i][j] = 1.
   对于第二种情况,有两种决策:要么删2个数,要么删3个数,删两个数的话就只能删i和j咯,如果f[i + 1][j - 1] = 1并且a[j] - a[i]在给定的公差集合里,那么f[i][j] = 1. 如果是删3个数,枚举一个中间点k,f[i + 1][k - 1] = f[k + 1][j - 1] = 1并且a[j] - a[k] = a[k] - a[i]并且a[j] - a[k]出现在了公差集合中,那么f[i][j] = 1.
   这只是处理出了区间能否被删除,如何求删除的数的最大数量呢?
   每个数只能被删一次,可以将之前处理的f[i][j]看作一条条线段[i,j],要找不相交的线段使得覆盖的长度最大,这个O(n^2)dp以下就好了.
   最近做的几道区间dp题都是很有套路的,首先是很容易能够看出区间dp的特征,设出基本状态,如果不能转移就加维度.所求的一般都是最值,如果状态不能直接表示成最值,就表示为是否可行.
#include <map>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; typedef long long ll;
map<ll,int> s;
ll T,n,m,can[][],f[],a[]; int main()
{
scanf("%lld",&T);
while (T--)
{
s.clear();
memset(can,,sizeof(can));
memset(f,,sizeof(f));
scanf("%lld%lld",&n,&m);
for (int i = ; i <= n; i++)
scanf("%lld",&a[i]);
for (int i = ; i <= m; i++)
{
ll x;
scanf("%lld",&x);
s[x] = ;
}
for (int len = ; len <= n; len++)
{
for (int i = ; i + len - <= n; i++)
{
int j = i + len - ;
if (len == )
{
if (s[a[j] - a[i]])
can[i][j] = ;
continue;
}
if (len == )
{
if (a[j] - a[j - ] == a[j - ] - a[i] && s[a[j] - a[j - ]])
can[i][j] = ;
continue;
}
for (int k = i + ; k < j - ; k++)
if (can[i][k] && can[k + ][j])
can[i][j] = ;
if (can[i + ][j - ] && s[a[j] - a[i]])
can[i][j] = ;
for (int k = i + ; k < j - ; k++)
if (can[i + ][k - ] && can[k + ][j - ] && a[j] - a[k] == a[k] - a[i] && s[a[j] - a[k]])
can[i][j] = ;
}
}
for (int i = ; i <= n; i++)
for (int j = ; j < i; j++)
{
f[i] = max(f[i],f[i - ]);
if (can[j][i])
f[i] = max(f[j - ] + i - j + ,f[i]);
}
printf("%lld\n",f[n]);
} return ;
}

Hdu5693 D Game的更多相关文章

  1. HDU-5693 D Game 动态规划 两次动规

    题目链接:https://cn.vjudge.net/problem/HDU-5693 题意 中文题 这个游戏是这样的,首先度度熊拥有一个公差集合{D},然后它依次写下N个数字排成一行.游戏规则很简单 ...

  2. hdu5693 D game&&hdu 5712 D++ game

    题目链接:5693 题目链接:5712 对于这个D game.注意消除之后两遍的序列是可以拼合到一起的!我们可以想到有区间DP的做法.我们设\(f[i][j]\)表示区间i,j可以被消除. 显然如果这 ...

  3. [总结-动态规划]经典DP状态设定和转移方程

    马上区域赛,发现DP太弱,赶紧复习补上. #普通DP CodeForces-546D Soldier and Number Game 筛法+动态规划 待补 UVALive-8078 Bracket S ...

随机推荐

  1. python-将爬取到的m3u8合并为mp4

    当你看到这个博客的时候恭喜你,你以后不用开vip就可以观看和下载vip视频了 最简单的观看vip视频步骤:进入全民解析网将vip视频地址进行解析 以下代码是通过python将vip视频进行下载为mp4 ...

  2. 关于kv的jch分片存储

    确定节点同步一致 节点启动之后,先获取本地的addrbook里面的节点信息 根据获取的addrbook里面的节点信息进行校验(向addrbook里面的节点发送hash消息确认,如果都一样,则可以广播数 ...

  3. 4个数的和为0 51nod 1267

    给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No". Input 第1行,1个数N,N为数组的长度(4 < ...

  4. 20172311-ASL测试 2018-1938872补充博客

    20172311-ASL测试 2018-1938872补充博客 课程:<程序设计与数据结构> 班级: 1723 姓名: 赵晓海 学号: 20172311 实验教师:王志强老师 测试日期:2 ...

  5. Java Web文件上传原理分析(不借助开源fileupload上传jar包)

    Java Web文件上传原理分析(不借助开源fileupload上传jar包) 博客分类: Java Web   最近在面试IBM时,面试官突然问到:如果让你自己实现一个文件上传,你的代码要如何写,不 ...

  6. HttpCookie Class

    提供创建和操作各 HTTP Cookie 的类型安全方法. #region 写入指定Cookie的值 +static void WriteCookie(string cookieName, strin ...

  7. Rsyslog-legacy(旧版本语法)配置说明及举例

    1. RULES-书写规则 格式:日志设备(类型).日志级别             日志处理方式 (1)日志类型分类 auth pam产生的日志 authpriv ssh,ftp等登录信息的验证信息 ...

  8. APUE(unix环境高级编程)第三版---first day---部署书中实例的运行环境(apue.h)

    操作环境:RHEL7.0 部署apue.h实例运行环境 1.下载头文件src.3e.tar.gz 2.解压 tar zxvf src.3e.tar.gz 3.创建普通用户(我仿照书上创建的sar用户) ...

  9. 《剑指offer》---左旋转字符串与右旋转字符串

    本文算法使用python3实现 1. 问题1 1.1 题目描述:   汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S, ...

  10. purcell的emacs配置中的自动补全功能开启

    标记一下,原文参看purcell的emacs配置中的自动补全功能开启 修改init-auto-complete.el文件 ;;(setq-default ac-expand-on-auto-compl ...