Description
有如下一个双人游戏:N(2 <= N <= 100)个正整数的序列放在一个游戏平台上,两人轮流从序列的两端取数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束。以最终得分多者为胜。
编一个执行最优策略的程序,最优策略就是使自己能得到在当前情况下最大的可能的总分的策略。你的程序要始终为第二位玩家执行最优策略。
Input
第一行: 正整数N, 表示序列中正整数的个数。
第二行至末尾: 用空格分隔的N个正整数(大小为1-200)。
Output
只有一行,用空格分隔的两个整数: 依次为玩家一和玩家二最终的得分。
Analysis
类似纪中做过的题目,传送门
f[i][j]=max(t[i]+sum[i+1][j]−f[i+1][j],t[j]+sum[i][j−1]−f[i][j−1])
其中
sum
是区间和,
f[i][j]
表示当前这个人从第
i
个数字取到第
边界条件
f[i][i]=t[i]
Code
#include <stdio.h>
using namespace std;
int f[201][201],sum[201][201],t[201];
int max(int x,int y)
{
return x<y?y:x;
}
int main()
{
int n;
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&t[i]);
f[i][i]=t[i];
}
for (int i=1;i<=n;i++)
for (int j=i;j<=n;j++)
sum[i][j]=sum[i][j-1]+t[j];
for (int j=1;j<=n-1;j++)
for (int i=1;i<=n-j;i++)
f[i][i+j]=max(t[i]+sum[i+1][i+j]-f[i+1][i+j],t[i+j]+sum[i][i+j-1]-f[i][i+j-1]);
printf("%d %d\n",f[1][n],sum[1][n]-f[1][n]);
return 0;
}