wikioi 黄金宝藏

来源:互联网 发布:winform开发框架源码 编辑:程序博客网 时间:2024/06/11 09:57

小毛终于到达宝藏点,他意外地发现有一个外星人(名叫Pluto)。宝藏是一些太空黄金,有n堆排成一行,每堆中有xi颗黄金。小毛和Pluto决定轮流从中取出黄金,规则是每次只能从最左边或最右边取出一堆黄金,直到所有黄金被取出。小毛先取,两人都以最优策略进行选取,求两人的最后所得。

第一行是正数n(≤500);第二行为n个正整数xi(≤300),表示每堆黄金的个数。

仅两个整数,分别表示小毛和Pluto的得分,以空格隔开。

4 7 2 9 5 2

18 11

题解

画一个表,用f[I][j]表示从第i位到第j位中先手可得到的最大得分,则f[i][j]=sum[i][j]-min(f[i+1][j], f[i][j-1])

代码如下

#include<cstdio>#include<cstring>#include<iostream>#include<cstdlib>#include<cmath>using namespace std;int n,a[502],f[502][502],sum[502];int main(){scanf("%d",&n);for(int i=1;i<=n;i++)   {int x;scanf("%d",&x);    f[i][i]=x; sum[i]=sum[i-1]+x;   }for(int j=1;j<n;j++)for(int i=1;i<=n-j;i++)   f[i][i+j]=sum[i+j]-sum[i-1]-min(f[i+1][i+j],f[i][i+j-1]);printf("%d %d",f[1][n],sum[n]-f[1][n]);return 0;}


 

0 0