sum游戏 Game of sum uva 10891 动态规划 备忘录(记忆化搜索)
来源:互联网 发布:php网盘搜索系统源码 编辑:程序博客网 时间:2024/05/16 22:20
题目的大意是有一个整数组成的序列,两个人轮流取数,只能从一端取一个或者多个数(这里大白书上写错了),当所有的数都被取完的时候,取到的所有的数之和为该玩家的分数,求A的分数-B的分数,两个人都是以最优的方案取值。这个问题使用动态规划求解,子问题就是i~j的子序列先手取得的分数最大值。
设d[i][j]表示子序列i~j的先手取数所获得的最大分数则d[i][j]=sum[i][j]-min(d[i+1][j],d[i+2][j],d[i+3][j],...,d[j][j],....,d[i][j-1],d[i][j-2],d[i][j-3],...,d[i][i],0)。0表示所有的数都被先手取完。因此最后的计算结果就是d[1][n]-(sum[1][n]-d[i][n])即是2*d[1][n]-sum[1][n]。动态规划使用备忘录方法。
#include<iostream>#include<cstdio>using namespace std;#define MAXN 200#define INF 1000000000int s[MAXN];int n;int d[MAXN][MAXN];int sum[MAXN];int dp(int i,int j){if(d[i][j]!=INF)return d[i][j];if(i==j)return sum[i]-sum[i-1];int t=0; for(int ii=i+1;ii<=j;ii++)t=min(t,dp(ii,j));for(int jj=j-1;jj>=i;jj--)t=min(t,dp(i,jj));d[i][j]=sum[j]-sum[i-1]-t;return d[i][j];}int main(){while(scanf("%d",&n),n){sum[0]=0;for(int i=0;i<MAXN;i++)for(int j=0;j<MAXN;j++)d[i][j]=INF;for(int i=1;i<=n;i++){scanf("%d",&s[i]);sum[i]=sum[i-1]+s[i];} cout<<dp(1,n)*2-sum[n]<<endl; }}
- sum游戏 Game of sum uva 10891 动态规划 备忘录(记忆化搜索)
- [动态规划] Sum游戏 ( Game of Sum, Uva 10891 )
- UVA 10891 Game of Sum dp(记忆化搜索)
- UVA 10891 Game of Sum(记忆化搜索+博弈)
- Uva 10891 Game of Sum - 区间DP..记忆化搜索
- UVA 10891 Game of Sum 记忆化搜索
- UVa 10891 Game of Sum / 记忆化搜索
- UVA 10891 Game of Sum (动态规划)
- UVa 10891(记忆化搜索,递推)Game of Sum
- 区间dp||记忆化搜索 Game of Sum UVA
- uva 10891 - Game of Sum 动态规划 状态选取
- 28.uva 10891 Game of Sum 记忆化dp
- Game of Sum(动态规划)
- Game of Sum 记忆化搜索/递推
- Uva 10891 sum 游戏 (及其变型) ;动态规划
- UVA 10891 - Game of Sum(DP)
- UVa 10891 Game of Sum(DP)
- UVA - 10891 - Game of Sum (DP)
- poj1006
- C/C++定义全局变量/常量几种方法的区别
- poj1007
- 网络编程(Socket编程)
- mapreduce下pagerank算法 自动收敛的算法
- sum游戏 Game of sum uva 10891 动态规划 备忘录(记忆化搜索)
- Linux makefile 教程 非常详细,且易懂
- 欢迎ly48694869重新回归程序员职业
- Linux 关机命令详解
- 全面剖析Linux库文件路径的添加
- Ubuntu 开机自动启动
- gcc编译c语言的uint问题
- 这是要把前几年积累的C++的节操给丢光吗
- Java学习总结之贪吃蛇项目程序编写(完结)