uva 10891 sum游戏(区间dp)



给定n个数字,A和B可以从这串数字的两端任意选数字,一次只能从一端选取。并且A B都尽力使自己选择的结果为最大的,可以理解成A B每一步走的都是最优的。如果A先选择,则A
B差值最大是多少。

思路:用d[i][j]表示当前选手先手走能获得的最大总分数,由于总的分数是一定的,那么状态转移方程为

d[i][j] = sum(i, j) - min( minleft(i+1, j), minright(i, j-1), 0)

其中minleft(i, j)表示min(d[i][j], d[i+1][j] ... d[j][j])

minright(i, j)表示min(d[i][j], d[i][j-1] ... d[i][i])

时间复杂度为O(n*n)

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#define eps 1e-6
#define LL long long
using namespace std;  

const int maxn = 100 + 5;
const int INF = 0x3f3f3f3f;
int A[maxn], d[maxn][maxn], minleft[maxn][maxn], minright[maxn][maxn], s[maxn];
int n;

void init() {
	scanf("%d", &A[0]); s[0] = A[0];
	for(int i = 1; i < n; i++) {
		scanf("%d", &A[i]);
		s[i] = s[i-1] + A[i];
	}
}

void solve() {
	for(int i = 0; i < n; i++) {
		d[i][i] = A[i];
		minleft[i][i] = d[i][i];
		minright[i][i] = d[i][i];
	}
	for(int j = 2; j <= n; j++) {
		for(int i = 0; i+j-1 < n; i++) {
			int mintmp = min(minleft[i+1][i+j-1], minright[i][i+j-2]);
			d[i][i+j-1] = s[i+j-1] - s[i] + A[i] - min(mintmp, 0);
			minleft[i][i+j-1] = min(d[i][i+j-1], minleft[i+1][i+j-1]);
			minright[i][i+j-1] = min(d[i][i+j-1], minright[i][i+j-2]);
		}
	}
//	cout << d[0][n-1] << endl;
	printf("%d\n", 2*d[0][n-1]-s[n-1]);
}

int main() {
	freopen("input.txt", "r", stdin);
	while(scanf("%d", &n) == 1 && n) {
		init();
		solve();
	}
	return 0;
}
时间: 2024-11-11 16:19:14

uva 10891 sum游戏(区间dp)的相关文章

UVa 10891 Sum游戏

https://vjudge.net/problem/UVA-10891 题意: 有一个长度为n的整数序列,两个游戏者A和B轮流取数,A先取.每次玩家只能从左端或者右端取任意数量个数,但不能两端都取.所有数都被取走后游戏结束,然后统计每个人取走的所有数之和,作为各自的得分.两个人采取的策略都是让自己的得分尽量高,并且两个人都足够聪明,求A的得分减去B的得分后的结果. 思路: 不管是轮到谁取数,都是在一个序列中从左边或右边开始取最大值. 那么我们就令d[i][j]表示先手在[i~j]序列中所能取到

UVA 10003 Cutting Sticks(区间dp)

Description  Cutting Sticks  You have to cut a wood stick into pieces. The most affordable company, The Analog Cutting Machinery, Inc. (ACM), charges money according to the length of the stick being cut. Their procedure of work requires that they onl

UVA 10003 Cutting Sticks 区间DP+记忆化搜索

UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的长度L,第二行是切割点的个数n,接下来的n行是切割点在木棍上的坐标. 输出切割木棍的最小费用 前话-区间dp简单入门 区间dp的入门下面博客写的非常好,我就是看的他们博客学会的,入门简单,以后的应用就得靠自己了. https://blog.csdn.net/qq_41661809/article/d

UVA - 10891 Game of Sum (区间dp)

题意:AB两人分别拿一列n个数字,只能从左端或右端拿,不能同时从两端拿,可拿一个或多个,问在两人尽可能多拿的情况下,A最多比B多拿多少. 分析: 1.枚举先手拿的分界线,要么从左端拿,要么从右端拿,比较得最优解. 2.dp(i, j)---在区间(i, j)中A最多比B多拿多少. 3.tmp -= dfs(i + 1, r);//A拿了区间(l, i),B在剩下区间里尽可能拿最优 tmp是A拿的,dfs(i + 1, r)是B比A多拿的,假设dfs(i + 1, r)=y-x,y是B拿的,x是A

uva10891 Game of Sum 博弈区间dp

// uva10891 Game of Sum // 这是在训练指南上看到的一题,啃了很久很久,到现在有 // 一定的动态规划的基础,然而博弈性的东西依然不会 // // // 一开始想的是dp(i,j)表示在i,j段取得最大值 // dp(i,j) = max(dp(i,i),d(i.i+1),...d(i,j-1),d(j-1,j),d(j-2,j)...d(i+1)(j);,sum(i,j)) // 然而,连样例都没过... // // 把表打出来看了一下,发现只是每次取了当前的最大值,根

qscoj 喵哈哈村的打印机游戏 区间dp

点这里去看题 区间dp ,dp[l][r][d]代表从l到r的区间底色为d,具体看代码 第一次见到区间dp...两个小时对着敲了五遍终于自己敲懂了一遍ac #include<bits/stdc++.h> using namespace std; int dp[55][55][55]; string s; int solve(int l,int r,int d) { if(l>r)return 0; if(l==r&&s[l]-'A'==d)return dp[l][r][

Uva 10003-Cutting Sticks(区间DP)

题目链接:点击打开链接 题意: 一根长度为L 的木棒,要求要切割n次,给出n次需要切割的位置,每次切割花费为当前段的总长度.求最小花费. 思路:..一开始想了好久也没往区间DP那方面想QAQ.设 dp[i][j] 为切割[i,j] 区间的最小花费,状态转移方程为 dp[i][j]=max(dp[i][k-1]+dp[k+1][j]+a[j+1]-a[i-1]); #include <algorithm> #include <iostream> #include <cstrin

UVA 1331 Minimax Triangulation 区间DP

区间DP: 将一个多边形三角剖分,让可以得到的最大三角形的面积最小 dp[i][j]表示从i点到j点的最优值,枚举中间点k dp[i][j]=min(dp[i][j],max(area(i,j,k),max(dp[i][k],dp[k][j]))); 注意如果中间三角形i-j-k中有其他的点,这样的三角形是不可以剖分的 Minimax Triangulation Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld

【bzoj2121】字符串游戏 区间dp

题目描述 给你一个字符串L和一个字符串集合S,如果S的某个子串在S集合中,那么可以将其删去,剩余的部分拼到一起成为新的L串.问:最后剩下的串长度的最小值. 输入 输入的第一行包含一个字符串,表示L. 第二行包含一个数字n,表示集合S中元素个数. 以下n行,每行一个字符串,表示S中的一个元素. 输入字符串都只包含小写字母. 输出 输出一个整数,表示L的最短长度. 样例输入 aaabccd3acabcaaa 样例输出 2 题解 我们考虑:每次删除连续的一段,对应到原串上即:删除 $[l,r]$ 中所