Today, Bob plays with a child. There is a row of n

numbers. One can takes a number from the left side or the right side in turns and gets the grade which equals to the number. Bob knows that the child always chooses the bigger number of the left side and right side. If the number from two sides is equal, child will always choose the left one.
The child takes first and the person who gets more grade wins. The child will be happy only when he wins the game.

Bob wants to make the child happy, please help him calculate the minimal difference of their grades when he loses the game.

InputThere are T test cases (T≤2).

For each test case:

the first line only contains a number n (1≤n≤90&&n%2==0)

The second line contains n integers: a1,a2…an(1≤ai≤105).

OutputFor each test ease, you should output the minimal difference
of their grades when Bob loses the game. If Bob can't lose the game,
output "The child will be unhappy...".

Sample Input

4
2 1 5 3
2
2 2

Sample Output

5
The child will be unhappy...

Child每次取最大的,如果相等就取左边的;

那么我们可以记忆化搜索出[L,R]区间的按游戏规则的可以取到的最大值和最小值;
df 表示 Grade_bob - Grade_child 的值;
如果df+dpmin[L,R]>0,那么剪去;
如果df+dpmax[L,R]<=ans,剪去;
如果df+dpmax[L,R]<0,更新,return;
然后就是搜索了,
(卡时也是秀)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<bitset>
#include<ctime>
#include<time.h>
#include<deque>
#include<stack>
#include<functional>
#include<sstream>
//#include<cctype>
//#pragma GCC optimize(2)
using namespace std;
#define maxn 200005
#define inf 0x7fffffff
//#define INF 1e18
#define rdint(x) scanf("%d",&x)
#define rdllt(x) scanf("%lld",&x)
#define rdult(x) scanf("%lu",&x)
#define rdlf(x) scanf("%lf",&x)
#define rdstr(x) scanf("%s",x)
#define mclr(x,a) memset((x),a,sizeof(x))
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int U;
#define ms(x) memset((x),0,sizeof(x))
const long long int mod = 1e9;
#define Mod 1000000000
#define sq(x) (x)*(x)
#define eps 1e-5
typedef pair<int, int> pii;
#define pi acos(-1.0)
//const int N = 1005;
#define REP(i,n) for(int i=0;i<(n);i++)
typedef pair<int, int> pii; inline int rd() {
int x = 0;
char c = getchar();
bool f = false;
while (!isdigit(c)) {
if (c == '-') f = true;
c = getchar();
}
while (isdigit(c)) {
x = (x << 1) + (x << 3) + (c ^ 48);
c = getchar();
}
return f ? -x : x;
} ll gcd(ll a, ll b) {
return b == 0 ? a : gcd(b, a%b);
}
int sqr(int x) { return x * x; } /*ll ans;
ll exgcd(ll a, ll b, ll &x, ll &y) {
if (!b) {
x = 1; y = 0; return a;
}
ans = exgcd(b, a%b, x, y);
ll t = x; x = y; y = t - a / b * y;
return ans;
}
*/
int n;
int a[maxn];
int sum[maxn];
int dp1[200][200], dp2[200][200];
int ST;
int Lim = 0.00045 * CLOCKS_PER_SEC; int DP1(int l, int r) {
int &ans = dp1[l][r];
if (ans != -1)return ans;
if (l > r)return ans = 0;
if (a[l] >= a[r])
ans = min(DP1(l + 1, r - 1) + a[r], DP1(l + 2, r) + a[l + 1]);
else
ans = min(DP1(l + 1, r - 1) + a[l], DP1(l, r - 2) + a[r - 1]);
return ans;
} int DP2(int l, int r) {
int &ans = dp2[l][r];
if (ans != -1)return ans;
if (l > r)return ans = 0;
if (a[l] >= a[r]) {
ans = max(DP2(l + 1, r - 1) + a[r], DP2(l + 2, r) + a[l + 1]);
}
else ans = max(DP2(l + 1, r - 1) + a[l], DP2(l, r - 2) + a[r - 1]);
return ans;
}
int ans; void dfs(int l, int r, int df) {
if (l > r) {
ans = max(ans, df); return;
}
if (df + 2 * dp1[l][r] - (sum[r] - sum[l - 1]) >= 0)return;
if (df + 2 * dp2[l][r] - (sum[r] - sum[l - 1]) <= ans)return;
if (df + 2 * dp2[l][r] - (sum[r] - sum[l - 1]) < 0) {
ans = max(ans, df + 2 * dp2[l][r] - (sum[r] - sum[l - 1]));
return;
}
if (clock() - ST > Lim)return;
if (a[l] >= a[r]) {
dfs(l + 1, r - 1, df + a[r] - a[l]);
dfs(l + 2, r, df + a[l + 1] - a[l]);
}
else {
dfs(l + 1, r - 1, df + a[l] - a[r]);
dfs(l, r - 2, df + a[r - 1] - a[r]);
}
}
int main()
{
// ios::sync_with_stdio(0); while (cin >> n) {
ms(a); ms(sum);
for (int i = 1; i <= n; i++)a[i] = rd(), sum[i] = sum[i - 1] + a[i]; ST = clock();
mclr(dp1, -1); mclr(dp2, -1);
DP1(1, n); DP2(1, n);
ans = -inf;
dfs(1, n, 0);
ans = abs(ans);
if (ans >= inf) {
puts("The child will be unhappy...");
}
else printf("%d\n", ans);
}
return 0;
}

hdu 6196 搜索+剪枝的更多相关文章

  1. hdu 5887 搜索+剪枝

    Herbs Gathering Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  2. hdu 4848 搜索+剪枝 2014西安邀请赛

    http://acm.hdu.edu.cn/showproblem.php?pid=4848 比赛的时候我甚至没看这道题,事实上不难.... 可是说实话,如今对题意还是理解不太好...... 犯的错误 ...

  3. poj 1198 hdu 1401 搜索+剪枝 Solitaire

    写到一半才发现能够用双向搜索4层来写,但已经不愿意改了,干脆暴搜+剪枝水过去算了. 想到一个非常水的剪枝,h函数为  当前点到终点4个点的最短距离加起来除以2.由于最多一步走2格,然后在HDU上T了, ...

  4. hdu 5469 Antonidas(树的分治+字符串hashOR搜索+剪枝)

    题目链接:hdu 5469 Antonidas 题意: 给你一颗树,每个节点有一个字符,现在给你一个字符串S,问你是否能在树上找到两个节点u,v,使得u到v的最短路径构成的字符串恰好为S. 题解: 这 ...

  5. hdu 5113(2014北京—搜索+剪枝)

    题意:有N*M的棋盘,用K种颜色去染,要求相邻块不能同色.已知每种颜色要染的块数,问能不能染,如果能,输出任一种染法. 最开始dfs失败了- -,优先搜索一行,搜完后进入下一列,超时.本来以为搜索不行 ...

  6. NOIP2015 斗地主(搜索+剪枝)

    4325: NOIP2015 斗地主 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 270  Solved: 192[Submit][Status] ...

  7. hdu 5636 搜索 BestCoder Round #74 (div.2)

    Shortest Path  Accepts: 40  Submissions: 610  Time Limit: 4000/2000 MS (Java/Others)  Memory Limit: ...

  8. luogu 1731 搜索剪枝好题

    搜索剪枝这个东西真的是骗分利器,然鹅我这方面菜的不行,所以搜索数学dp三方面是真的应该好好训练一下 一本通的确该认真的刷嗯 #include<bits/stdc++.h> using na ...

  9. 搜索+剪枝——POJ 1011 Sticks

    搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...

随机推荐

  1. 【原创】0. MYSQL++的环境准备

    1. 获取 Google MYSQL++,第一个就是,然后跟着要求进行下载. 2. 编译和安装 其实在作者的各种README文档里面已经写得很清楚了,现在对一些可能会出现问题的地方进行一下回顾. Wi ...

  2. Hyperledger Fabric系统架构

  3. Use SFTP in Linux (转)

    From http://www.cnblogs.com/chen1987lei/archive/2010/11/26/1888391.html sftp 是一个交互式文件传输程式.它类似于 ftp, ...

  4. xgboost 完全调参指南

    http://www.2cto.com/kf/201607/528771.html xgboost: https://www.analyticsvidhya.com/blog/2016/03/comp ...

  5. Oracle——SQL基础

    一.SQL语句分为以下三种类型: DML: Data Manipulation Language 数据操纵语言DDL: Data Definition Language 数据定义语言DCL: Data ...

  6. MFC可视化 列表控件的使用

    1.应该加入头文件   #include <Atlbase.h>   2.示例     类向导给列表控件绑定变量m_list DWORD   dwExStyle=LVS_EX_FULLRO ...

  7. SVN下载地址及注意事项

    SVN下载地址:VisualSVN:http://www.visualsvn.com/server/download     服务器端(添加仓库和用户)TortoiseSVN:http://torto ...

  8. (回溯法)ip地址的合理性

    题目: 给定一个只包含数字的字符串,通过返回所有可能有效的IP地址组合来恢复它. 例如: 给定“”, return [“255.255.11.135”,“255.255.111.35”]. (顺序无所 ...

  9. javascript总结16:数组array12

    1 Array 对象 作用:Array 对象用于在变量中存储多个值. 1.1 数组定义 var ary = new Array();//通过创建对象的方式创建数组 var ary1 = [];// 直 ...

  10. cgroup初步分析(1)

    cgroup的功能和作用不废话,直说一下cgroup的几条设计准则,有了几条设计准则的约束,就比较容易理解其中的数据结构和函数,至于源代码cgroup.c,无非是两个内容,一是task_struct. ...