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 花匠 动规 找拐点 树状数组
花匠 描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致. 具体 ...
随机推荐
- Unity 围绕X、Y、Z旋转图例
绿色:绕X 红色:绕Y 蓝色:绕Z PS:这是右手坐标系,Unity为左手坐标系 不知道啥叫左手右手?参见我的另一篇文章http://www.cnblogs.com/36bian/p/7571727. ...
- 使用其他Java工程导入hadoop源码用于在hadoop工程中查看源码
疑问:在开发hadoop程序的时候,有时候需要查看hadoop的源码,但是开发环境看不到,甚是烦恼,经过网上搜索和琢磨,终于实现了,虽然有点绕,但是目的达到了. 第一步:下载hadoop的源码包:ha ...
- mac上用VMWare虚拟机装Linux-Ubuntu
1.下载vmware fusion for Mac 网上有很多,大家自己找吧 2.安装Vmware 3.序列号可以在网上找,或者淘宝几块钱买一个(记得买对应版本的) 4.之后就下一步,完成就好 安装U ...
- [51nod1074]约瑟夫环V2
N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数.问最后剩下的人的编号. 例如:N = 3,K = 2.2号先出列,然后是1号,最后剩下的是3号. ...
- pip常见用法汇总
1.pip安装 yum -y install epel-release && yum -y install python-pip 2.pip安装软件 (1)安装单个软件:pip ins ...
- 让前端攻城师独立于后端进行开发: Mock.js
一.Mock.js是什么? 目前的大部分公司的项目都是采用的前后端分离, 后端接口的开发和前端人员是同时进行的. 那么这个时候就会存在一个问题, 在页面需要使用大量数据进行渲染生成前, 后端开发人员的 ...
- Python数学实现二元一次方程
import cmath import math import sys def get_float(msg,allow_zero): x = None while x is None: try: x ...
- django-1-框架介绍
<<<python虚拟环境>>> 用django框架做web开发必须要用到python虚拟环境,而且一个虚拟环境只能创建一个django项目,如果创建多个djang ...
- 从CSDN搬过来
https://blog.csdn.net/qq_34416123 从CSDN搬过来 神奇的代码竟然没有弄成博客园这里面的格式 所以以前的很多博客的代码都是直接放在那里了. 懒得去改了.
- ZJU 2671 Cryptography
Cryptography Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on ZJU. Original I ...