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;
}

浙公网安备 33010602011771号