P2734 游戏 A Game
题目背景
有如下一个双人游戏:N(2 <= N <= 100)个正整数的序列放在一个游戏平台上,游戏由玩家1开始,两人轮流从序列的任意一端取一个数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束。以最终得分多者为胜。
区间DP,可以从左边拿,也可以从右边拿
转台转移方程:$f[i][j]=c[j]-c[i]-min(f[i][j-1],f[i+1][j])$
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int n,c[105],f[105][105]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&c[i]),c[i]+=c[i-1]; for(int k=1;k<=n;k++) for(int j,i=1;i+k-1<=n;i++){ j=i+k-1; f[i][j]=c[j]-c[i-1]-min(f[i+1][j],f[i][j-1]); } cout<<f[1][n]<<" "<<c[n]-c[0]-f[1][n]; return 0; }