题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5693

题解:

一种朴实的想法是枚举选择可以删除的两个或三个数(其他的大于三的数都能凑成2和3的和),删掉。然后一直递归下去。但删除子串的操作不容易,而且搜索复杂度有点大,记忆化判相同子序列也不容易。

可以看出,这些问题都是由于删除这个操作引起的。

因此为了保证dp的可操作性,我们没必要真的删除,另dp[l][r]表示区间[l,r]能删除的最大个数,如果dp[l][r]==r-l+1说明这一段是都可以删除的。这样子就可以用区间dp乱搞做出来了。

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std; const int maxn = ; int n, m;
int arr[maxn], mat[maxn][maxn],dp[maxn][maxn]; void init() {
memset(mat, , sizeof(mat));
memset(dp, , sizeof(dp));
} void solve() {
//dp[l][r]==r-l+1说明l和r之间是可以全部删除掉的。
for (int len = ; len <= n; len++) {
for (int l = ; l <= n; l++) {
int r = l + len; if (r > n) break;
dp[l][r] = dp[l + ][r - ];
if (mat[l][r]&&dp[l + ][r - ] == r - l - )
dp[l][r] = max(dp[l][r], dp[l + ][r - ] + ); for (int i = l + ; i < r; i++) {
if (mat[l][i] && dp[l + ][i - ] == i - l - )
dp[l][r] = max(dp[l][r], dp[l + ][i - ] + dp[i + ][r] + );
if (mat[i][r] && dp[i + ][r - ] == r - i - )
dp[l][r] = max(dp[l][r], dp[l][i - ] + dp[i + ][r - ] + );
if (mat[l][i] && mat[i][r] && arr[r] - arr[i] == arr[i] - arr[l] &&
dp[l + ][i - ] == i - l - && dp[i + ][r - ] == r - i - ) {
dp[l][r] = max(dp[l][r], r - l + );
}
}
//拆掉i,i+1的匹配。
for (int i = l; i <r; i++) {
dp[l][r] = max(dp[l][r], dp[l][i] + dp[i+][r]);
}
}
}
} int main() {
int tc;
scanf("%d", &tc);
while (tc--) {
scanf("%d%d", &n, &m); init();
for (int i = ; i <= n; i++) scanf("%d", arr + i);
for (int i = ; i < m; i++) {
int d; scanf("%d", &d);
for (int i = ; i <= n; i++) {
for (int j = i + ; j <= n; j++) {
if (arr[j] - arr[i] == d) mat[i][j] = ;
}
}
}
solve(); printf("%d\n", dp[][n]);
}
return ;
}

HDU 5693 D Game 区间dp的更多相关文章

  1. hdu 5693 && LightOj 1422 区间DP

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

  2. HDU 5115 Dire Wolf 区间dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5115 Dire Wolf Time Limit: 5000/5000 MS (Java/Others ...

  3. hdu 4597 Play Game 区间dp

    Play Game Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=459 ...

  4. hdu 4745 Two Rabbits 区间DP

    http://acm.hdu.edu.cn/showproblem.php?pid=4745 题意: 有两只兔子Tom Jerry, 他们在一个用石头围城的环形的路上跳, Tom只能顺时针跳,Jerr ...

  5. hdu 5181 numbers——思路+区间DP

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5181 题解:https://www.cnblogs.com/Miracevin/p/10960717.ht ...

  6. HDU 1141---Brackets Sequence(区间DP)

    题目链接 http://poj.org/problem?id=1141 Description Let us define a regular brackets sequence in the fol ...

  7. HDU 4632 Palindrome subsequence(区间dp,回文串,字符处理)

    题目 参考自博客:http://blog.csdn.net/u011498819/article/details/38356675 题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数. ...

  8. hdu 2476(第一道区间dp)

    题意:就是给定两个字符串,第一个是初始串,第二个是目标串,问你把初始串变到目标串最少需要多少串! 分析:此题分两步,第一步是假设开始的初始串是空串,然后就进行区间dp,dp[i][j]代表把区间[i, ...

  9. HDU 4632 Palindrome subsequence (区间DP)

    题意 给定一个字符串,问有多少个回文子串(两个子串可以一样). 思路 注意到任意一个回文子序列收尾两个字符一定是相同的,于是可以区间dp,用dp[i][j]表示原字符串中[i,j]位置中出现的回文子序 ...

随机推荐

  1. MySQL 5 绿色版(BAT版本) mysql50green转自http://hi.baidu.com/dburu/blog/item/e753fcc4362458aa8226accb.htmlMySQL 5 绿色版(BAT版本) By )

    以前提供下载的那个 MySQL 绿色版是来自于 Web 开发工具箱之 Apache PHP MySQL 绿色套装版, 原作者是为了方便自己开发所做的一套整合了 Apache, PHP, MySQL 的 ...

  2. Centos 7.1+CDH5.7.2全部署流程

    前期准备: JDK环境 版本:jdk-8u101-linux-x64.rpm 下载地址:oracle官网 mysql rpm包:http://dev.mysql.com/get/Downloads/M ...

  3. centos查看设置端口开放状态

    centos查看端口是否已开放/etc/init.d/iptables status centos开放端口/sbin/iptables -I INPUT -p tcp --dport 8000 -j ...

  4. Ubuntu14.04安装GNOME3桌面

    以下是安装方法: sudo add-apt-repository ppa:gnome3-team/gnome3 sudo apt-get update sudo apt-get dist-upgrad ...

  5. SQL Server中查询结果拼接遇到的小问题

    前天的项目,刚接手,对于模块还不是很熟悉,其中有一个模块,涉及到4个表,其中主要的表就有两个,只要把这个弄清楚了就一切回归于“太平”了. 模块要求:把两个表的内容查询出来,结果连接在一起.大师说完,感 ...

  6. xml结构

    一.XmlHelper using System; using System.Collections.Generic; using System.Linq; using System.Web; usi ...

  7. [.ashx檔?泛型处理例程?]基础入门#1....能否用中文教会我?别说火星文?

    原文出處  http://www.dotblogs.com.tw/mis2000lab/archive/2013/08/20/ashx_beginner_01.aspx [.ashx檔?泛型处理例程? ...

  8. 【转载!】关于C#的RawSocket编程的问题

    Q:你好! 看过了你在csdn上发表的<用C#下的Raw Socket编程实现网络封包监视>,觉得很感兴趣,而且对我的帮助很大.不过在调试的过程中遇到一些问题,特此向你请教一下.谢谢! 首 ...

  9. c语言结构体保存并输出学生信息

    最近在学习数据结构,巩固下c语言. #include<stdio.h> /*定义结构体student并设置别名stud*/ /*typedef struct student{ int nu ...

  10. 自学Python三 Python中的屠龙刀(续)

    装饰器: 在函数代码功能运行期间动态增加功能的方式叫做装饰器(Decorator).它对一个函数或者类进行再加工. 我们先定义两个函数,一个计算两数和,一个计算两数差. >>> de ...