UVA 10891——Game of Sum
2016-03-25 22:11
399 查看
题意:给定一个长度为n的序列,两个人分别从两端开始取若干数,但是规定要么左,要么右,问双方都采取最优策略下A的总和减去B的值。
思路:区间dp,dp(i,j)表示先手的总和,那么状态转移方程便为dp(i,j)=sum(i,j)-min(左边取,右边取,0(取完)),记忆化搜索。
code:
思路:区间dp,dp(i,j)表示先手的总和,那么状态转移方程便为dp(i,j)=sum(i,j)-min(左边取,右边取,0(取完)),记忆化搜索。
code:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int M=110; int s[M],a[M],d[M][M],vis[M][M],n; int dp(int i,int j) { if (vis[i][j]) return d[i][j]; vis[i][j]=1; int m=0; for (int k=i+1;k<=j;k++) m=min(m,dp(k,j)); for (int k=i;k<j;k++) m=min(m,dp(i,k)); d[i][j]=s[j]-s[i-1]-m; return d[i][j]; } int main() { while(cin>>n,n) { s[0]=0; for (int i=1;i<=n;i++) { cin>>a[i]; s[i]=s[i-1]+a[i]; } memset(vis,0,sizeof(vis)); cout<<2*dp(1,n)-s <<endl; } }
相关文章推荐
- 数据存储----------------SDcard
- hdu1016(dfs实现环状全排序)
- 进程管理与查看命令
- Flume实时抽取监控目录数据
- Trick(十四)—— 判断是否序列中所有的元素都相同
- leetcode 210. Course Schedule II
- iOS内存管理-所有权修饰符:__strong, __weak/__unsafe_unretained, __autoreleasing
- 成功不是偶然的
- Ubuntu, Pycharm, Theano, nvcc not found
- Android基础之IO流
- CSS float 定位和缩放问题
- Spring boot配置cache
- 配置python镜像源
- 堆排序(python实现)
- Spring boot配置cache
- 矢量场
- 纯虚函数与抽象类2
- CSS 基础笔记
- Delphi基础Write写入结构体到文件(使用 file of myrecord就行了,真简单)
- PHP文件操作之文件的类型和属性