uva 10891 Game of Sum
2011-11-29 18:07
316 查看
题意:给你n(最多100)个数,有A,B两个人,两个人都可以从这些数的左右两个边界取数,A先取,如果两个都是按最优策略取,那么最后A的分数比B的多多少.
定义状态map[x][y][z]表示从x到y这段石子,z(0或1表示当前A取,或B取)能得到的最多的分数。
则状转移成,在x与y这个范围内的值的和减去在x和y在这个范围内z^1能取得的最多的分数,
定义状态map[x][y][z]表示从x到y这段石子,z(0或1表示当前A取,或B取)能得到的最多的分数。
则状转移成,在x与y这个范围内的值的和减去在x和y在这个范围内z^1能取得的最多的分数,
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N=105; int a ,data ,map [2]; bool vis [2]; int dp(int,int,int); int main() { int n; while(scanf("%d",&n)!=EOF) { if(n==0) break; memset(vis,0,sizeof(vis)); memset(data,0,sizeof(data)); int sum=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); data[i]+=(data[i-1]+a[i]); sum+=a[i]; } dp(1,n,0); printf("%d\n",2*map[1] [0]-sum); } } int dp(int x,int y,int z) { bool &flag=vis[x][y][z]; int &res=map[x][y][z]; if(flag) return res; else if(x>y) { flag=1;res=0; return res; } else { res=-2000000000; for(int i=1;i<=y-x+1;i++) { res=max(res,data[y]-data[x-1]-dp(x+i,y,z^1)); res=max(res,data[y]-data[x-1]-dp(x,y-i,z^1)); } flag=1;return res; } }
相关文章推荐
- UVA - 10891 Game of Sum (区间DP)@
- Uva-10891-Game of Sum
- uva 10891 Game of Sum (DP)
- UVA 10891 Game of Sum(区间DP)
- UVa 10891 Game of Sum (区间DP&博弈)
- uva 10891 - Game of Sum
- UVA - 10891 Game of Sum(记忆化搜索 区间dp)
- UVA 10891 Game of Sum(区间DP)
- UVa 10891 - Game of Sum
- UVa 10891 Game of Sum(博弈区间DP)
- UVA 10891 Game of Sum(区间DP)
- UVa10891 Game of Sum
- uva 10891 Game of Sum (DP水题)
- UVA 10891 Game of Sum(dp博弈)
- UVA 10891 Game of Sum
- UVA 10891 Game of Sum(区间DP)
- UVA 10891 Game of Sum(区间DP)
- UVA - 10891 Game of Sum
- UVa10891 Game of Sum(dp)
- UVA 10891 Game of Sum