【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 104853
  • 排名 - 233

最新评论

阅读排行榜

评论排行榜

有如下一个双人游戏:N(2 <= N <= 100)个正整数的序列放在一个游戏平台上,两人轮流从序列的两端取数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束。以最终得分多者为胜。

编一个执行最优策略的程序,最优策略就是使自己能得到在当前情况下最大的可能的总分的策略。你的程序要始终为两位玩家执行最优策略。

格式
PROGRAM NAME: game1
INPUT FORMAT:(file game1.in)

第一行: 正整数N, 表示序列中正整数的个数。

第二行至末尾: 用空格分隔的N个正整数(大小为1-200)。

OUTPUT FORMAT:(file game1.out)

只有一行,用空格分隔的两个整数: 依次为玩家一和玩家二最终的得分。

SAMPLE INPUT
6
4 7 2 9 5 2

SAMPLE OUTPUT
18 11

解析: nocow的解析和CODE

【参考程序】:
/*
ID: XIONGNA1
PROG: game1
LANG: C++
*/
#include
<iostream>
#include
<cstring>
using namespace std;
int a[201],f[201][201],sum[201][201];
int n;
void DP()
{
    
for (int i=n-1;i>=1;i--)
        
for (int j=i+1;j<=n;j++)
        {
            sum[i][j]
=sum[i][j-1]+a[j];
            f[i][j]
=max(sum[i+1][j]+a[i]-f[i+1][j],sum[i][j-1]+a[j]-f[i][j-1]);
        }
}
int main()
{
    freopen(
"game1.in","r",stdin);
    freopen(
"game1.out","w",stdout);
    scanf(
"%d",&n);
    
for (int i=1;i<=n;i++)
    {
        scanf(
"%d",&a[i]);
        sum[i][i]
=a[i]; f[i][i]=a[i];
    }
    DP();
    printf(
"%d %d\n",f[1][n],sum[1][n]-f[1][n]);
    
return 0;
}
posted on 2009-07-26 15:57 开拓者 阅读(227) 评论(0)  编辑 收藏 引用 所属分类: USACO 题解

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理