题目链接:https://cn.vjudge.net/problem/HDU-5693

题意

中文题

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

  1. 在当前剩下的有序数组中选择X(X≥2) 个连续数字;
  2. 检查1选择的X个数字是否构成等差数列,且公差 d∈{D};
  3. 如果2满足,可以在数组中删除这X个数字;
  4. 重复 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)分开所有可删子区间,我们可以这样子:

  1. 区间可分为两个可删区间,dp=max(dp[i][k]+dp[k+1][j])
  2. 区间两端可以删去等差数列,dp=max(dp[i+1][j-1])
  3. 区间两端和中间可以删去等差数列,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 动态规划 两次动规的更多相关文章

  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

    D Game HDU - 5693 众所周知,度度熊喜欢的字符只有两个:B 和D. 今天,它发明了一个游戏:D游戏. 度度熊的英文并不是很高明,所以这里的D,没什么高深的含义,只是代指等差数列[(等差 ...

  3. HDU——Monkey and Banana 动态规划

                                                                       Monkey and Banana Time Limit:2000 ...

  4. HDU 1159 Common Subsequence (动规+最长公共子序列)

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  5. 【noip 2009】 乌龟棋 记忆化搜索&动规

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...

  6. LCS(最长公共子序列)动规算法正确性证明

    今天在看代码源文件求diff的原理的时候看到了LCS算法.这个算法应该不陌生,动规的经典算法.具体算法做啥了我就不说了,不知道的可以直接看<算法导论>动态规划那一章.既然看到了就想回忆下, ...

  7. - > 动规讲解基础讲解一——01背包(模板)

    作为动态规划的基础,01背包的思想在许多动规问题中会经常出现,so,熟练的掌握01背包的思路是极其重要的: 有n件物品,第i件物品(I = 1,2,3…n)的价值是vi, 重量是wi,我们有一个能承重 ...

  8. 关于DP动规

    今天学了动规,简单记录一下自己理解了的:(要不俺就忘了) 首先,啥是DP??? 动态规划,其实就是组合子问题的解来解决整个问题的解,由于每个子问题他只判断一次,所以不会重复计算,那就很牛啊!!! 专业 ...

  9. NOIP2013 提高组day2 2 花匠 动规 找拐点 树状数组

    花匠 描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致. 具体 ...

随机推荐

  1. Hihocoder1061-Beautiful String

    时间限制:10000ms单点时限:1000ms内存限制:256MB 描述 We say a string is beautiful if it has the equal amount of 3 or ...

  2. JS判断客户端是否是iOS或者Android或者ipad(二)

    js判断客户端是IPAD和iphone 多了就不说了,直接上代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22     funct ...

  3. 阿里云数据库MySQL版快速上手!

    MySQL是全球最受欢迎的开源数据库,其在各Web应用中均有广泛部署.阿里云数据库MySQL版基于Alibaba的MySQL源码分支,经过双11高并发.大数据量的考验,拥有优良的性能和吞吐量.除此之外 ...

  4. 洛谷T47092 作业_简单状压动归

    只要注意一下细节就毫无难点了,简简单单状态压缩即可. Code: #include<cstdio> #include<algorithm> using namespace st ...

  5. 新手须知 QT类大全

    QT类大全,在行内容中罗列出来了,希望大家多看看,如果是API就更好了,但可惜不是.这些是一些大类,请多做参考. QApplication 应用程序类 QLabel 标签类 QPushButton 按 ...

  6. 【codeforces 768F】Barrels and boxes

    [题目链接]:http://codeforces.com/problemset/problem/768/F [题意] 让你把f个food和w个wine装在若干个栈里面; 每个栈只能装food或者是wi ...

  7. PatentTips - Increasing turbo mode residency of a processor

    BACKGROUND Many modern operating systems (OS's) use the Advanced Configuration and Power Interface ( ...

  8. VS 2013+Qt 5.4.1

    Qt应用能够用Qt Creator开发,也能够使用Visual Studio. 我之前一直用Qt Creator.也始终认为这是最好的选择.只是有人偏爱Visual Studio,我也由于工作须要,要 ...

  9. Unity3D——加入剑痕效果(PocketRPG Trail插件)

    首先非常感谢大家的支持,因为近期项目吃紧,所以更新的速度可能会有点慢!希望大家谅解,当然大家的支持是我最大的动力.我也会尽我所能写出更好的文章,当然因为本人是个新手并且工作的内容也不是unity3D. ...

  10. nyoj--586--疯牛(二分&&枚举)

    疯牛 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间 ...