HDU-5693 D Game 动态规划 两次动规
题目链接:https://cn.vjudge.net/problem/HDU-5693
题意
中文题
这个游戏是这样的,首先度度熊拥有一个公差集合{D},然后它依次写下N个数字排成一行。游戏规则很简单:
- 在当前剩下的有序数组中选择X(X≥2) 个连续数字;
- 检查1选择的X个数字是否构成等差数列,且公差 d∈{D};
- 如果2满足,可以在数组中删除这X个数字;
- 重复 1−3 步,直到无法删除更多数字。
度度熊最多能删掉多少个数字,如果它足够聪明的话。
n, m<=300
思路
一开始又没思路,最后还是老师给的答案。
现在想想的话,我们可以记住有哪些常见状态和转移,以便提升发展。
设dp[i]为前i个数字下能删去的数字和,那么转移方程:
dp[i]=max(dp[i-1], max( dp[j-1]+i-j+1 | [i, j]为可删去的区间 ))
好了转移方程有了,那么可删区间怎么来?
这里可以按区间长度动规,我是怎么也没想到这点:
我们将x表示为某等差序列,[]表示可删子区间,那么整个可删区间可以表示为:
例子:x[]x[][]x[][][]xxx[]x[]
那么为了唯一的(保证一个DAG)分开所有可删子区间,我们可以这样子:
- 区间可分为两个可删区间,dp=max(dp[i][k]+dp[k+1][j])
- 区间两端可以删去等差数列,dp=max(dp[i+1][j-1])
- 区间两端和中间可以删去等差数列,dp=max(dp[i+1][k-1]+dp[k+1][j-1])
那么状态转移就可以写了。
提交过程
| AC |
代码
#include <set>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=300+20, maxm=maxn;
set<long long> isd;
int num[maxn], dp[maxn];
bool seg[maxn][maxn];
long long tmp;
int main(void){
int T, n, m;
scanf("%d", &T);
while (T--){
scanf("%d%d", &n, &m);
isd.clear();
memset(seg, false, sizeof(seg));
for (int i=1; i<=n; i++) scanf("%d", &num[i]), seg[i][i-1]=true;
for (int i=0; i<m; i++) scanf("%lld", &tmp), isd.insert(tmp);
for (int len=1; len<n; len++)
for (int i=1; i+len<=n; i++){
int j=i+len;
if (seg[i+1][j-1] && isd.count(num[j]-num[i]))
seg[i][j]=true;
if (!seg[i][j]) for (int k=i+1; k<j; k++){
seg[i][j]=seg[i][k]&&seg[k+1][j]; // 1
if (seg[i][j]) break;
}
if (!seg[i][j]) for (int k=i+1; k<j; k++){
if (num[k]-num[i]==num[j]-num[k] && isd.count(num[k]-num[i])){
seg[i][j]=seg[i+1][k-1]&&seg[k+1][j-1]; // 2
if (seg[i][j]) break;
}
}
}
memset(dp, 0, sizeof(dp));
for (int i=1; i<=n; i++){
dp[i]=dp[i-1];
for (int j=1; j<=i-1; j++) if (seg[j][i])
dp[i]=max(dp[i], dp[j-1]+i-j+1); // 3
}printf("%d\n", dp[n]);
}
return 0;
}
| Time | Memory | Length | Lang | Submitted |
|---|---|---|---|---|
| 561ms | 1360kB | 1470 | G++ | 2018-08-07 02:54:18 |
HDU-5693 D Game 动态规划 两次动规的更多相关文章
- hdu 5693 && LightOj 1422 区间DP
hdu 5693 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5693 等差数列当划分细了后只用比较2个或者3个数就可以了,因为大于3的数都可以由2和3 ...
- hdu 5693 D Game
D Game HDU - 5693 众所周知,度度熊喜欢的字符只有两个:B 和D. 今天,它发明了一个游戏:D游戏. 度度熊的英文并不是很高明,所以这里的D,没什么高深的含义,只是代指等差数列[(等差 ...
- HDU——Monkey and Banana 动态规划
Monkey and Banana Time Limit:2000 ...
- HDU 1159 Common Subsequence (动规+最长公共子序列)
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- 【noip 2009】 乌龟棋 记忆化搜索&动规
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...
- LCS(最长公共子序列)动规算法正确性证明
今天在看代码源文件求diff的原理的时候看到了LCS算法.这个算法应该不陌生,动规的经典算法.具体算法做啥了我就不说了,不知道的可以直接看<算法导论>动态规划那一章.既然看到了就想回忆下, ...
- - > 动规讲解基础讲解一——01背包(模板)
作为动态规划的基础,01背包的思想在许多动规问题中会经常出现,so,熟练的掌握01背包的思路是极其重要的: 有n件物品,第i件物品(I = 1,2,3…n)的价值是vi, 重量是wi,我们有一个能承重 ...
- 关于DP动规
今天学了动规,简单记录一下自己理解了的:(要不俺就忘了) 首先,啥是DP??? 动态规划,其实就是组合子问题的解来解决整个问题的解,由于每个子问题他只判断一次,所以不会重复计算,那就很牛啊!!! 专业 ...
- NOIP2013 提高组day2 2 花匠 动规 找拐点 树状数组
花匠 描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致. 具体 ...
随机推荐
- iOS构建流畅的交互界面--CPU,GPU资源消耗的原因和解决方案
CPU资源消耗的原因和解决方案对象创建轻量对象代替重量对象* 不需要响应触摸事件的控件:CALayer显示* 对象不涉及UI操作,则尽量放到后台线程创建* 包含有CALayer的控件只能在主线程创建和 ...
- 关于函数调用约定-thiscall调用约定
函数调用约定描述了如何以正确的方式调用某些特定类型的函数.包括了函数参数在栈上的分配顺序.有哪些参数将通过寄存器传入,以及在函数返回时函数栈的回收方式等. 函数调用约定的几种类型 stdcall,cd ...
- 页面定制CSS代码初探(一):页面变宽 文本自动换行 图片按比缩放
初识博客 初写博客,先在设置里选了个喜欢的模板 第一眼就爱上了呢!那极简的风格,我喜欢!!但是,应用后,却发现... 纳尼!模板上右侧那张漂亮的图片呢?!我的怎么什么都没有.没有图片好难看啊,瞬间无爱 ...
- mongodb配置文件详解
logpath=/app/mongo/mongolog/mongo.log dbpath=/app/mongo/mongodata verbose = true #vvvv = true #此项会产生 ...
- jenkins 展示报告
1.下载插件 HTML Publisher plugin 2.设置说明 3.展示css 下载插件 (1).Startup Trigger: 可实现在Jenkins节点(master/slave)启动时 ...
- Ubuntu_18.04安装网易云音乐
首先到网易云音乐官网下载网易云音乐,ubuntu版的,安装. 这时候的图标打不开,缺少libcanberra sudo apt install libcanberra-gtk-module 安装完了配 ...
- JS iframe给父类传值
父类页面 <html><head> <script type="text/javascript"> function Ge ...
- springcloud关键词解释和基础代码
原文来自某位大神(不诉薄凉),感觉很好,分享出来. SpringCloud微服务框架搭建 一.微服务架构 1.1什么是分布式 不同模块部署在不同服务器上 作用:分布式解决网站高并发带来问题 1.2什么 ...
- Thinking in file encoding and decoding?
> General file encoding ways We most know, computer stores files with binary coding like abc\xe4\ ...
- CF895C Square Subsets (组合数+状压DP+简单数论)
题目大意:给你一个序列,你可以在序列中任选一个子序列,求子序列每一项的积是一个平方数的方案数. 1<=a[i]<=70 因为任何一个大于2的数都可以表示成几个质数的幂的乘积 所以我们预处理 ...