uva10891 - Game of Sum
来源:互联网 发布:php动态加密系统 编辑:程序博客网 时间:2024/05/13 17:33
题意:
给一个序列,AB两人比赛,每人每次只能从左或从右取任意连续数,都足够聪明,极力想让自己赢,A先开始取,让你求A和B都取最优策略时,A-B的得分结果。
思路:
初写dp没多久,式子怎么也推不出来,看了题解,原来是这样的:
让sum[i]表示前i个数总和,要求A-B即求 A - (sum[n]- A),即求2*A-sum[n]。
求A的话,让dp[i][j]表示A在第i~j个数中取到的值,则dp[1][n]即为最终要求得的A,有dp[i][j]=(sum[j]-sum[i-1]) - 区间i~j的最小值(m).
代码如下:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 105;int arr[N],sum[N],dp[N][N],visit[N][N],n;int dfs(int i,int j) { if (visit[i][j]) return dp[i][j]; visit[i][j] = 1; int k, m = 0; for (k = i + 1; k <= j; k++) m = min(m, dfs(k, j)); for (k = i; k < j; k++) m = min(m, dfs(i, k)); dp[i][j] = sum[j] - sum[i - 1] - m; return dp[i][j];}int main() { int n; while (~scanf("%d", &n) && n) { int i; memset(visit, 0, sizeof(visit)); for (i = 1; i <= n; i++) { scanf("%d", &arr[i]); sum[i] = sum[i - 1] + arr[i]; } printf("%d\n", 2 * dfs(1, n) - sum[n]); } return 0;}
0 0
- UVA10891- Game of Sum
- uva10891 Game of Sum
- uva10891 - Game of Sum
- uva10891 - Game of Sum(动归)
- uva10891 Game of Sum 博弈区间dp
- UVA10891 Game of Sum(区间DP+思路)
- UVA10891 Game of Sum(区间DP)
- UVA10891[Game of Sum] 动态规划
- UVa10891 Game of Sum(dp)
- uva10891 Game of Sum(博弈+区间dp+优化)
- 例题28 UVa10891 Game of Sum(DP)
- uva10891 - Game of Sum(递推,极大极小的思想)
- Game of Sum
- 10891 - Game of Sum
- 10891 - Game of Sum
- Game of Sum UVA
- 例题1.28 Sum游戏 UVa10891
- uva 10891 Game of Sum
- JS动态原型
- hdu4512吉哥系列故事——完美队形I【LICS】
- UOJ #9 vfk的数据 排序 字典序比较
- stat,fstat,and lstat Functions
- 怎样学习一门新技术
- uva10891 - Game of Sum
- hdoj 1702 ACboy needs your help again!(栈和队列的基础题)
- C语言之鞍点的查找
- Windows 7远程桌面连接Ubuntu 14.04
- usaco 1.5.1 numtri
- 异常(Exceptions)
- FMDB使用
- 用css clip属性制作漂亮的环形效果
- 无线路由器密码安全设置