码迷,mamicode.com
首页 > 其他好文 > 详细

Game of Sum

时间:2017-12-05 01:00:18      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:sum   main   eof   sizeof   clu   size   游戏   mem   连续子序列   

可以知道整体石子的总和一定的,所以一个人的得分越高,另一个人的得分就越低。不管怎么取任意时刻游戏的状态都是原始序列的一段连续子序列(即被玩家取剩下的序列)。

因此,用d(i,j)表示玩家A在i到j部分的最大和,在双方都采取最优策略的情况下,先手得分最大值。

d[i][j] = sum[i][j] - min(dp(i + k, j), dp(i, j - k)); (1 <= k <= j - i + 1)

#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
using namespace std;
int S[105], A[105], d[105][105], vis[105][105], n;
int dp(int i, int j) 
{
    if (vis[i][j]) 
        return d[i][j];
    vis[i][j] = 1;
    int m = 0;
    for (int k=i+1;k<=j;k++) 
    {
        m=min(m,dp(k,j));
    }
    for(int k=i;k<j;k++)
    {
        m=min(m,dp(i,k));
    }
    d[i][j]=S[j]-S[i-1]-m;
    return d[i][j];
}
int main() 
{
    while (scanf("%d", &n), n) 
    {
        memset(vis, 0, sizeof(vis));
        S[0]=0;
        for(int i=1;i<=n;i++) 
        {
            scanf("%d", &A[i]);
            S[i]=S[i-1]+A[i];
        }
        printf("%d\n",2*dp(1,n)-S[n]); //dp(1, n) - (S[n] - dp(1, n))
    }
    return 0;
}

  

Game of Sum

标签:sum   main   eof   sizeof   clu   size   游戏   mem   连续子序列   

原文地址:http://www.cnblogs.com/shanshuiyouxiangfeng/p/7979676.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!