<题目链接>

题目大意:

两个人轮流从一个序列中取数,他们都面临同样的二选一决策:是拿走最左边的数,还是拿走最右边的数?问先手最多能够得到的分数是多少。

解题分析:

一道比较经典的DP,因为每次只能从数组的两端取走一个数,所以每次面对的数组都只可能是一段连续的子数组。我们不妨假设$dp[l][r]$表示对于数组$A[i]~A[j]$,先手能够获得的最多得分。于是状态的转移就不难得出了。

枚举所有区间:

$l==r$的时候,肯定是$dp[l][r]=arr[l]$

而对于其他区间大于1的情况,$dp[l][r]=max(dp[l][r],((sum[r]-sum[l-1])-min(dp[l+1][r],dp[l][r-1])))$

官方题解 >>>

递推DP

#include <bits/stdc++.h>
using namespace std; #define N int(1e3+5)
int n,dp[N][N],arr[N],sum[N]; int main(){
scanf("%d",&n);
sum[]=;
for(int i=;i<=n;i++)scanf("%d",&arr[i]),sum[i]=sum[i-]+arr[i];
memset(dp,-0x3f,sizeof(dp));
for(int i=n;i>=;i--){
dp[i][i]=arr[i];
for(int j=i+;j<=n;j++){
dp[i][j]=max(dp[i][j],(sum[j]-sum[i-])-min(dp[i+][j],dp[i][j-]));
}
}
printf("%d\n",dp[][n]);
}

记忆化搜索

#include <bits/stdc++.h>
using namespace std; const int N = 1e3+;
int n,arr[N],dp[N][N],sum[N]; int DP(int l,int r){
if(l>r)return ;
if(dp[l][r]!=-)return dp[l][r];
dp[l][r]=-1e9;
if(l==r)dp[l][r]=arr[l];
else dp[l][r]=max(dp[l][r],(sum[r]-sum[l-])-min(DP(l+,r),DP(l,r-)));
return dp[l][r];
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&arr[i]),sum[i]=sum[i-]+arr[i];
}
memset(dp,-,sizeof(dp));
printf("%d\n",DP(,n));
}

最新文章

  1. button自适应宽度 并根据屏幕宽自动换行排列
  2. Scrapy框架实现爬虫
  3. android虚拟机
  4. [bzoj2243][SDOI2011]染色
  5. 【设计模式】Java版设计模式的类图汇总
  6. UNIX 网络编程第三版
  7. Java_Swing实现小球沿正弦曲线运动的代码
  8. [HDU 4433]locker[DP]
  9. sql server中创建链接服务器图解教程
  10. Homestead 使用总结
  11. 【C#】HTTP请求GET,POST(远程证书失效)
  12. Rsync同步、Rsync+Lsync实时同步
  13. [Codeforces375E]Red and Black Tree
  14. 第76节:Java中的基础知识
  15. Java中关于AbstractQueuedSynchronizer的入门(一)
  16. 【leeetcode】125-Valid Palindrome
  17. eclipce导入java 项目不可用
  18. 详解MySQL数据表类型
  19. 一种模块化开发的目录结构和部署tips
  20. JDBC SQL语法

热门文章

  1. FMT 与 子集(逆)卷积
  2. 【BZOJ5495】[十二省联考2019]异或粽子(主席树,贪心)
  3. 阶梯Nim问题
  4. Help Me Escape ZOJ - 3640
  5. 基于Matlab实现多次最佳一致的函数逼近(类似求渐进函数)
  6. Nginx禁止IP直接访问网站
  7. vue---mixins的用法
  8. redis发布/订阅
  9. Nginx故障排错及一个网站小实例
  10. ConcurrentLinkedQueue使用和方法介绍