AT_dp_l Deque题解

题目描述

太郎君和次郎君进行如下游戏。

最初,给定一个数列 a=(a1​,a2​,…,aN​)。两人轮流进行如下操作,直到 a 变为空。太郎君先手。

  • 可以移除 a 的首元素或末元素。设移除的元素为 x,则执行操作的人获得 x 分。

游戏结束时,太郎君的总得分为 X,次郎君的总得分为 Y。太郎君希望最大化 X−Y,次郎君则希望最小化 X−Y。

假设两人都采取最优策略,求 X−Y 的值。

输入格式

输入以如下格式从标准输入读入。

N a1​ a2​ … aN​

输出格式

假设两人都采取最优策略,输出 X−Y 的值。

显示翻译

题意翻译

输入输出样例

输入 #1复制

4
10 80 90 30

输出 #1复制

10

输入 #2复制

3
10 100 10

输出 #2复制

-80

输入 #3复制

1
10

输出 #3复制

10

输入 #4复制

10
1000000000 1 1000000000 1 1000000000 1 1000000000 1 1000000000 1

输出 #4复制

4999999995

输入 #5复制

6
4 2 9 7 1 5

输出 #5复制

2

说明/提示

限制条件

  • 输入均为整数。
  • 1≤N≤3000
  • 1≤ai​≤109

样例解释 1

两人采取最优策略时,操作过程如下。被操作的元素用粗体表示。

  • 先手:(10, 80, 90, 30)→(10, 80, 90)
  • 后手:(10, 80, 90)→(10, 80)
  • 先手:(10, 80)→(10)
  • 后手:(10)→() 此时,X=30+80=110,Y=90+10=100。

样例解释 2

两人采取最优策略时,操作过程例如如下。

  • 先手:(10, 100, 10)→(100, 10)
  • 后手:(100, 10)→(10)
  • 先手:(10)→() 此时,X=10+10=20,Y=100。

样例解释 4

答案可能超出 32 位整数范围。

样例解释 5

两人采取最优策略时,操作过程例如如下。

  • 先手:(4, 2, 9, 7, 1, 5)→(4, 2, 9, 7, 1)
  • 后手:(4, 2, 9, 7, 1)→(2, 9, 7, 1)
  • 先手:(2, 9, 7, 1)→(2, 9, 7)
  • 后手:(2, 9, 7)→(2, 9)
  • 先手:(2, 9)→(2)
  • 后手:(2)→() 此时,X=5+1+9=15,Y=4+7+2=13。

由 ChatGPT 4.1 翻译

思路

区间DP。

代码见下

#include<bits/stdc++.h>
using namespace std;
long long n,a[3001],f[3001][3001],op=-1e9-7;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		for(int l=1;l+i-1<=n;l++){
			int r=l+i-1;
			if((n-i)%2==1){
				f[l][r]=min(f[l+1][r]-a[l],f[l][r-1]-a[r]);
			}
			else{
				f[l][r]=max(f[l+1][r]+a[l],f[l][r-1]+a[r]);			
			}
		}
	}
	cout<<f[1][n]<<endl;
	return 0;
}

posted @ 2025-10-22 21:09  bz02_2023f2  阅读(2)  评论(0)    收藏  举报  来源