hdu 4597 + uva 10891(一类区间dp)
题目链接:http://vjudge.net/problem/viewProblem.action?id=19461
思路:一类经典的博弈类区间dp,我们令dp[l][r]表示玩家A从区间[l, r]得到的最大值,于是就有dp[l][r] = sum[l][r] - min(dp[l + i][r], dp[l][r - i]) (i >= 1 && i + l <= r),最终我们要求的就是dp[1][n] - (sum[1][n] - dp[1][n]).
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#define FOR(i, a, b) for (int i = (a); i <= (b); ++i)
#define RFOR(i, a, b) for (int i = (a); i >= (b); --i)
using namespace std; int dp[111][111], sum[111], a[111], N; int dfs(int l, int r)
{
if (l > r) return 0;
if (~dp[l][r]) return dp[l][r];
int res = 0;
FOR(i, l + 1, r) {
res = min(res, dfs(i, r));
}
RFOR(i, r - 1, l) {
res = min(res, dfs(l, i));
}
return dp[l][r] = sum[r] - sum[l - 1] - res;
} int main()
{
while (cin >> N && N) {
FOR(i, 1, N) cin >> a[i], sum[i] = sum[i - 1] + a[i];
memset(dp, -1, sizeof(dp));
cout << 2 * dfs(1, N) - sum[N] << endl;
}
return 0;
}
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4597
这道题和上一题差不多,只是多了维数,dp[al][ar][bl][br]表示从第一堆的al~ar和第二堆的bl~br中取得的最大值.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define FOR(i, a, b) for (int i = (a); i <= (b); ++i)
using namespace std; int a[22], b[22], N;
int dp[22][22][22][22]; int dfs(int al, int ar, int bl, int br, int sum)
{
if (al > ar && bl > br) return 0;
if (~dp[al][ar][bl][br]) return dp[al][ar][bl][br];
int res = 0;
if (al <= ar) {
res = max(res, sum - dfs(al + 1, ar, bl, br, sum - a[al]));
res = max(res, sum - dfs(al, ar - 1, bl, br, sum - a[ar]));
}
if (bl <= br) {
res = max(res, sum - dfs(al, ar, bl + 1, br, sum - b[bl]));
res = max(res, sum - dfs(al, ar, bl, br - 1, sum - b[br]));
}
return dp[al][ar][bl][br] = res;
} int main()
{
int Cas; cin >> Cas;
while (Cas--) {
cin >> N; int sum = 0;
FOR(i, 1, N) cin >> a[i], sum += a[i];
FOR(i, 1, N) cin >> b[i], sum += b[i];
memset(dp, -1, sizeof(dp));
cout << dfs(1, N, 1, N, sum) << endl;
}
return 0;
}
hdu 4597 + uva 10891(一类区间dp)的更多相关文章
- HDU 4597 Play Game(区间DP(记忆化搜索))
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4597 题目大意: 有两行卡片,每个卡片都有各自的权值. 两个人轮流取卡片,每次只能从任一行的左端或右端 ...
- HDU 2476 String painter (区间DP)
题意:给出两个串a和b,一次只能将一个区间刷一次,问最少几次能让a=b 思路:首先考虑最坏的情况,就是先将一个空白字符串刷成b需要的次数,直接区间DP[i][j]表示i到j的最小次数. 再考虑把a变成 ...
- HDU 5151 Sit sit sit 区间DP + 排列组合
Sit sit sit 问题描述 在一个XX大学中有NN张椅子排成一排,椅子上都没有人,每张椅子都有颜色,分别为蓝色或者红色. 接下来依次来了NN个学生,标号依次为1,2,3,...,N. 对于每个学 ...
- hdu 5115 Dire Wolf(区间dp)
Problem Description Dire wolves, also known as Dark wolves, are extraordinarily large and powerful w ...
- HDU 2476 String painter(区间DP)
String painter Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 4745 Two Rabbits(区间DP,最长非连续回文子串)
Two Rabbits Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total ...
- UVA - 1632 Alibaba (区间dp+常数优化)
题目链接 设$dp[l][r][p]$为走完区间$[l,r]$,在端点$p$时所需的最短时间($p=0$代表在左端点,$p=1$代表在右端点) 根据题意显然有状态转移方程$\left\{\begin{ ...
- UVA 10559 Blocks——区间dp
题目:https://www.luogu.org/problemnew/show/UVA10559 应该想到区间dp.但怎么设计状态? 因为连续的东西有分值,所以应该记录一下连续的有多少个. 只要记录 ...
- UVA 10559 Blocks —— 区间DP
题目:https://www.luogu.org/problemnew/show/UVA10559 区间DP,有点难想: 为了方便,先把原来就是连续一段相同颜色的点看做一个点,记一下长度: f[i][ ...
随机推荐
- 十一天 python操作rabbitmq、redis
1.启动rabbimq.mysql 在""运行""里输入services.msc,找到rabbimq.mysql启动即可 2.启动redis 管理员进入cmd, ...
- http apr 8080 exec 3解决
IDEA运行tomcat,总是出现这个错误. 解决: 在tomcat的配置里,加上下面这句话: -Xms256m -Xmx512m -XX:MaxNewSize=64m -XX:MaxPermSize ...
- android 和iOS的view上的区别
android上的view的类叫View, 以下是它的class overview, This class represents the basic building block for user i ...
- ACM/ICPC 之 数据结构-邻接表+DP+队列+拓扑排序(TSH OJ-旅行商TSP)
做这道题感觉异常激动,因为在下第一次接触拓扑排序啊= =,而且看了看解释,猛然发现此题可以用DP优化,然后一次A掉所有样例,整个人激动坏了,哇咔咔咔咔咔咔咔~ 咔咔~哎呀,笑岔了- -|| 旅行商(T ...
- 18. javacript高级程序设计-JavaScript与XML
1. JavaScript与XML IE采取了下列方式: l 通过ActiveX对象来支持处理XML,而相同的对象也可以用来构建桌面应用程序 l Windows携带了MSXML库,JavaScript ...
- java入门 第一季4
1.数组 1).声明数组 数据类型[]数组名; 数据类型 数组名[]; 2).分配空间 数组名=new 数据类型[数组长度]: 3).赋值 score[0]=98: 直接创建一个长度为4的数组 int ...
- Effective C++ -----条款49:了解new-handler 的行为
set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用. Nothorw new 是一个颇为局限的工具,因为它只适用于内存分配:后继的构造函数调用还是可能抛出异常.
- BestCoder27 1001.Jump and Jump... (hdu 5162) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5162 题目意思:有 n 个 kid,每个 kid 有三个成绩 a, b, c.选最大的一个成绩作为这个 ...
- Android Shape自定义纯色圆角按钮
版权声明:分享技术,传播快乐.如果本博客对你有帮助,请在我的博客首页为我打赏吧! 在Android开发中,为响应美化应用中控件的效果,使用Shape定义图形效果,可以解决图片过多的问题. 首先看一下效 ...
- 【Git】笔记2
来源:廖雪峰 安装git(ubuntu) sudo apt-get install git 创建版本库(repository) 在想生成版本库的文件夹下输入: git init 指定用户名和邮箱 g ...