1031 - Easy Game (记忆化搜索)
2015-11-20 23:13
197 查看
1031 - Easy Game
You are playing a two player game. Initially there are ninteger numbers in an array and player
A and B get chance to takethem alternatively. Each player can take one or more numbers from the left orright end of the array but cannot take from both ends at a time. He can take asmany consecutive numbers as he wants during
his time. The game ends when allnumbers are taken from the array by the players. The point of each player iscalculated by the summation of the numbers, which he has taken. Each playertries to achieve more points from other. If both players play optimally andplayer
A starts the game then how much more point can player Aget than player
B?
Each case contains a blank line and an integer N (1≤ N ≤ 100) denoting the size of the array. The next linecontains
N space separated integers. You may assume that no number willcontain more than
4 digits.
4
4 -10 -20 7
4
1 2 3 4
Case 2: 10
题解: 记忆化搜索. 首先我们可以把问题抽象~最大能最大化他的分数值为dp[v][i]p[1n],因为先手面临的状态是1~n; 有了这个子结构的话,状态转移方程就很容易写了.
AC代码:
/* ***********************************************
Author :xdlove
Created Time :2015年11月20日 星期五 22时22分21秒
File Name :lightoj/1031/Easy_Game.cpp
************************************************ */
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <memory.h>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define REP_ab(i,a,b) for(int i = a; i <= b; i++)
#define REP(i, n) for(int i = 0; i < n; i++)
#define REP_1(i,n) for(int i = 1; i <= n; i++)
#define DEP(i,n) for(int i = n - 1; i >= 0; i--)
#define DEP_N(i,n) for(int i = n; i >= 1; i--)
#define CPY(A,B) memcpy(A,B,sizeof(B))
#define MEM(A) memset(A,0,sizeof(A))
#define MEM_1(A) memset(A,-1,sizeof(A))
#define MEM_INF(A) memset(A,0x3f,sizeof(A))
#define MEM_INFLL(A) memset(A,0x3f3f,sizeof(A))
#define mid (((l + r) >> 1))
#define lson l, mid, u << 1
#define rson mid + 1, r, u << 1 | 1
#define ls (u << 1)
#define rs (u << 1 | 1)
typedef long long ll;
typedef unsigned long long ull;
const int INF = 0x3f3f3f3f;
const ll INFLL = 0x3f3f3f3f3f3f3f3f;
const int MAXN = 1e5 + 5;
const int MAXM = MAXN;
const int mod = 1e9 + 7;
int dp[2][110][110],a[110],n;
int dfs(int v,int l,int r) {
int &ans = dp[v][l][r],Max,tp;
if(l > r) return 0;
if(~ans) return ans;
ans = 0;
Max = -INF;
for(int i = l; i <= r; i++) {
ans += a[i];
Max = max(Max,ans - dfs(v ^ 1,i + 1,r));
}
ans = 0;
for(int i = r; i >= l; i--) {
ans += a[i];
Max = max(Max,ans - dfs(v ^ 1,l,i - 1));
}
return ans = Max;
}
int main() {
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T,cnt = 0;
cin>>T;
while(T--) {
MEM_1(dp);
scanf("%d",&n);
REP_1(i,n) scanf("%d",&a[i]);
printf("Case %d: %d\n",++cnt,dfs(0,1,n));
}
return 0;
}
PDF (English) | Statistics | Forum |
Time Limit: 2 second(s) | Memory Limit: 32 MB |
A and B get chance to takethem alternatively. Each player can take one or more numbers from the left orright end of the array but cannot take from both ends at a time. He can take asmany consecutive numbers as he wants during
his time. The game ends when allnumbers are taken from the array by the players. The point of each player iscalculated by the summation of the numbers, which he has taken. Each playertries to achieve more points from other. If both players play optimally andplayer
A starts the game then how much more point can player Aget than player
B?
Input
Input starts with an integer T (≤ 100),denoting the number of test cases.Each case contains a blank line and an integer N (1≤ N ≤ 100) denoting the size of the array. The next linecontains
N space separated integers. You may assume that no number willcontain more than
4 digits.
Output
For each test case, print the case number and the maximumdifference that the first player obtained after playing this game optimally.Sample Input
24
4 -10 -20 7
4
1 2 3 4
Output for Sample Input
Case 1: 7Case 2: 10
题解: 记忆化搜索. 首先我们可以把问题抽象~最大能最大化他的分数值为dp[v][i]p[1n],因为先手面临的状态是1~n; 有了这个子结构的话,状态转移方程就很容易写了.
AC代码:
/* ***********************************************
Author :xdlove
Created Time :2015年11月20日 星期五 22时22分21秒
File Name :lightoj/1031/Easy_Game.cpp
************************************************ */
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <memory.h>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define REP_ab(i,a,b) for(int i = a; i <= b; i++)
#define REP(i, n) for(int i = 0; i < n; i++)
#define REP_1(i,n) for(int i = 1; i <= n; i++)
#define DEP(i,n) for(int i = n - 1; i >= 0; i--)
#define DEP_N(i,n) for(int i = n; i >= 1; i--)
#define CPY(A,B) memcpy(A,B,sizeof(B))
#define MEM(A) memset(A,0,sizeof(A))
#define MEM_1(A) memset(A,-1,sizeof(A))
#define MEM_INF(A) memset(A,0x3f,sizeof(A))
#define MEM_INFLL(A) memset(A,0x3f3f,sizeof(A))
#define mid (((l + r) >> 1))
#define lson l, mid, u << 1
#define rson mid + 1, r, u << 1 | 1
#define ls (u << 1)
#define rs (u << 1 | 1)
typedef long long ll;
typedef unsigned long long ull;
const int INF = 0x3f3f3f3f;
const ll INFLL = 0x3f3f3f3f3f3f3f3f;
const int MAXN = 1e5 + 5;
const int MAXM = MAXN;
const int mod = 1e9 + 7;
int dp[2][110][110],a[110],n;
int dfs(int v,int l,int r) {
int &ans = dp[v][l][r],Max,tp;
if(l > r) return 0;
if(~ans) return ans;
ans = 0;
Max = -INF;
for(int i = l; i <= r; i++) {
ans += a[i];
Max = max(Max,ans - dfs(v ^ 1,i + 1,r));
}
ans = 0;
for(int i = r; i >= l; i--) {
ans += a[i];
Max = max(Max,ans - dfs(v ^ 1,l,i - 1));
}
return ans = Max;
}
int main() {
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T,cnt = 0;
cin>>T;
while(T--) {
MEM_1(dp);
scanf("%d",&n);
REP_1(i,n) scanf("%d",&a[i]);
printf("Case %d: %d\n",++cnt,dfs(0,1,n));
}
return 0;
}
相关文章推荐
- 搜狗百度360市值齐跌:搜索引擎们陷入集体焦虑?
- 本人即将筹备败家日志,敬请期待!
- IE:使用搜索助手
- C++深度优先搜索的实现方法
- 基于文本的搜索
- php实现搜索一维数组元素并删除二维数组对应元素的方法
- 使用Sphinx对索引进行搜索
- asp 多关键词搜索的简单实现方法
- C#使用foreach语句搜索数组元素的方法
- JavaScript中数组的排序、乱序和搜索实现代码
- C#编程实现Excel文档中搜索文本内容的方法及思路
- sqlserver中在指定数据库的所有表的所有列中搜索给定的值
- 可以用来搜索当前页面内容的js代码
- 全文搜索和替换
- javascript搜索自动提示功能的实现第1/3页
- mysql 模糊搜索的方法介绍
- C#搜索文字在文件及文件夹中出现位置的方法
- 基于ASP.NET的lucene.net全文搜索实现步骤
- 做个自己站内搜索引擎
- PHP查找与搜索数组元素方法总结