Game Of Sum(区间dp)

原题: https://vjudge.net/problem/UVA-10891

大致题意: 有一个游戏,A和B两个玩家,还有一串数字,每个玩家每次可以从这串数的左边或者右边取一个或者几个连续的数,规定A先取,然后轮到B,依次交替,直到所有的数都取完,计算A和B各自拿到的数的和,计算得出结果A-B。这个取的过程规定 A和B都十分聪明, 每次都保证使自己拿到的数的和尽量最大!

没想出来,很失望,要加油了!

#include<stdio.h>
#include<memory.h>
int arr[101];//题目给的数组 
int sum[101][101];//记录i 到 j之间的和
int dp[101][101];//dp[i][j]表示从i到j可以取到的最大值 
int flag[101][101];//标志区间i到j求过了没有 
int min(int a,int b)
{
	if(a<b)return a;
	return b;
}
int dfs(int i,int j)
{
	if(flag[i][j]==1)
	{
		return dp[i][j];
	}
	int re = sum[i][j];//区间I到j的数全部取了 
	for(int k=1;i+k<=j;k++)//取左边起的第k个 或者 取右边起的第k个; 
	{
		int tmp = sum[i][j]-min(dfs(i+k,j),dfs(i,j-k));
		if(re<tmp)
		{
			re=tmp;
		}
	}
	dp[i][j]=re;//记录 
	flag[i][j]=1;
	return re;
}
int main()
{
	int n;
	scanf("%d",&n);
	while(n)
	{
		memset(sum,0,sizeof(sum));
		memset(flag,0,sizeof(flag));
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&arr[i]);//输入数组 
			flag[i][i]=1;
			dp[i][i]=arr[i];
			for(int j=1;j<=i;j++)//记录区间i到区间j的和 
			{
				sum[j][i]=sum[j][i-1]+arr[i];
			}
		}
		int tmp1 = dfs(1,n); //第一个人可以取到的最大分数 
		int tmp2 = sum[1][n]-tmp1;//相应第二个人的分数 
		printf("%d\n",tmp1-tmp2);
		scanf("%d",&n);
	}	
	return 0;
} 



猜你喜欢

转载自blog.csdn.net/zark721/article/details/78495481