hdu 4579 博弈+区间dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4597
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std; const int maxe = ;
const int maxn = ;
const int INF = 0x3f3f3f; int dp[maxn][maxn][maxn][maxn]; //dp[l1][r1][l2][r2] 表示先手与后手取得到的最大差值。
bool vis[maxn][maxn][maxn][maxn];
int a[maxn],b[maxn];
int N; int dfs(int l1,int r1,int l2,int r2){
if(vis[l1][r1][l2][r2]) return dp[l1][r1][l2][r2];
vis[l1][r1][l2][r2] = true; if(l1>r1 && l2>r2) return dp[l1][r1][l2][r2] = ; //这地方必须这样写,不能只写成return 0;
int ans = -INF; if(l1 <= r1){
ans = max(ans,a[l1] - dfs(l1+,r1,l2,r2)); //dfs(l1+1,r1,l2,r2)表示你先手走了以后,别人作为先手得到的最大差值。所以应该用a[l1]-dfs()表示你作为先手的最大值。
ans = max(ans,a[r1] - dfs(l1,r1-,l2,r2));
}
if(l2 <= r2){
ans = max(ans,b[l2] - dfs(l1,r1,l2+,r2));
ans = max(ans,b[r2] - dfs(l1,r1,l2,r2-));
}
return dp[l1][r1][l2][r2] = ans;
}
int main()
{
//freopen("E:\\acm\\input.txt","r",stdin);
int T;
cin>>T;
while(T--){
cin>>N;
memset(dp,-0x3f,sizeof(dp));
memset(vis,,sizeof(vis));
int tot = ;
for(int i=;i<=N;i++) scanf("%d",&a[i]), tot += a[i];
for(int i=;i<=N;i++) scanf("%d",&b[i]), tot += b[i]; dfs(,N,,N);
cout<<(dp[][N][][N]+tot)/<<endl;
}
}
下面是参考别人例外一种好的思路:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std; const int maxe = ;
const int maxn = ;
const int INF = 0x3f3f3f; int dp[maxn][maxn][maxn][maxn]; //dp[l1][r1][l2][r2] 表示先手取得到的最大值。
int a[maxn],b[maxn];
int sum1[maxn],sum2[maxn];
int N; int dfs(int l1,int r1,int l2,int r2){
if(dp[l1][r1][l2][r2] != - ) return dp[l1][r1][l2][r2] ;
if(l1>r1 && l2>r2) return ;
int ans = ;
int sum = ;
if(l1 <= r1) sum += sum1[r1] - sum1[l1-];
if(l2 <= r2) sum += sum2[r2] - sum2[l2-]; if(l1 <= r1){
ans = max(ans,sum-dfs(l1+,r1,l2,r2)); //避免了直接用dp[l1][r1][l2][r2];
ans = max(ans,sum-dfs(l1,r1-,l2,r2));
}
if(l2 <= r2){
ans = max(ans,sum-dfs(l1,r1,l2+,r2));
ans = max(ans,sum-dfs(l1,r1,l2,r2-));
}
return dp[l1][r1][l2][r2] = ans;
}
int main()
{
//freopen("E:\\acm\\input.txt","r",stdin);
int T;
cin>>T;
while(T--){
cin>>N;
memset(dp,-,sizeof(dp));
sum1[] = ; sum2[] = ;
for(int i=;i<=N;i++) scanf("%d",&a[i]), sum1[i] = sum1[i-] + a[i];
for(int i=;i<=N;i++) scanf("%d",&b[i]), sum2[i] = sum2[i-] + b[i]; cout<<dfs(,N,,N)<<endl;
}
}
hdu 4579 博弈+区间dp的更多相关文章
- Uva 10891 经典博弈区间DP
经典博弈区间DP 题目链接:https://uva.onlinejudge.org/external/108/p10891.pdf 题意: 给定n个数字,A和B可以从这串数字的两端任意选数字,一次只能 ...
- hdu 5396 Expression(区间dp)
Problem Description Teacher Mai has n numbers a1,a2,⋯,anand n−1 operators("+", "-&quo ...
- You Are the One HDU - 4283 (区间DP)
Problem Description The TV shows such as You Are the One has been very popular. In order to meet the ...
- Dire Wolf HDU - 5115(区间dp)
Dire Wolf Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others)Total ...
- HDU 5568 sequence2 区间dp+大数
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5568 题意: 求所有长度为k的严格升序子序列的个数. 题解: 令dp[i][k]表示以i结尾的长度为 ...
- uva10891 Game of Sum(博弈+区间dp+优化)
题目:点击打开链接 题意:两个人做游戏,共有n个数,每个人可以任选一端取任意多连续的数,问两个人都想拿最多的情况下,先手最多比后手多拿多少分数. 思路:这题一开始想到的是用dp[i][j]表示区间[i ...
- Hdu 2513 区间DP
Cake slicing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- hdu 4597 + uva 10891(一类区间dp)
题目链接:http://vjudge.net/problem/viewProblem.action?id=19461 思路:一类经典的博弈类区间dp,我们令dp[l][r]表示玩家A从区间[l, r] ...
- HDU 4283---You Are the One(区间DP)
题目链接 http://acm.split.hdu.edu.cn/showproblem.php?pid=4283 Problem Description The TV shows such as Y ...
随机推荐
- HashMap HashTable HashSet
原文转载自 http://blog.csdn.net/wl_ldy/article/details/5941770 HashMap是新框架中用来代替HashTable的类 也就是说建议使用HashMa ...
- PDF在线预览
1.所需插件jquery.media.js或者pdfobject.js 代码: <html> <head> <style type="text/css" ...
- Core Data 教学
看了一篇国外的文章,关于iOS9的Core Data教学,在这里做了一下总结 Core Data 教学 示例开源地址:LastDayCoreData 在这篇文章中我们将学习Core Data的系列教程 ...
- SGU 138.Games of Chess
时间限制:0.25s 空间限制:4M 题目: n个朋友在一起按照下面的规则依次下棋:在第一局游戏,n个人中的两个开始下棋.在第二局,第一局胜利的人将跟其他人下棋(也可能还是输了第一局人), 在第三局第 ...
- SGU 164.Airline(结论题)
时间限制:0.25s 空间限制:4M 题意: 在n(1<=n<=200)个点的无向完全图中,有m种不同的边.现在从中选择不超过(m+1)/2种边,使得任意两点可以通过不超过3条边互相到达. ...
- Linux系统、版本、CPU、内存查看、硬盘空间
查看系统版本:lsb_release -a [root@localhost /]# lsb_release -a LSB Version: :core-4.0-amd64:core-4.0-no ...
- WordPress防暴力破解:安全插件和用.htpasswd保护WordPress控制面板
正在用Wordpress的博主们一定知道最近全球兴起的一波黑客锁定Wordpress暴力破解控制面板密码的风波了,据CloudFlare执行长Matthew Prince所说,所谓的暴力密码攻击是输入 ...
- php框架练习
框架的作用: 功能:操作数据库 模版引擎smarty 分析,应该具备什么功能? a:具体配置文件 ,配置文件的读取功能 b:数据库处理类 c:目录结构 先建一个includes文件放入,配置文件(co ...
- window 配置 sendmail
从http://glob.com.au/sendmail/下载sendmail.zip 解压sendmail.zip到目录下(最好使用短路径,长路径会导致问题的出现),我安装的路径是: E:\wamp ...
- img超出div width时, jQuery动态改变图片显示大小
参考: 1. http://blog.csdn.net/roman_yu/article/details/6641911 2. http://www.cnblogs.com/zyzlywq/archi ...