Game Of Sum(区间dp)
2017-11-09 23:56
134 查看
原题: 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]
-tmp1;//相应第二个人的分数
printf("%d\n",tmp1-tmp2);
scanf("%d",&n);
}
return 0;
}
大致题意: 有一个游戏,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]
-tmp1;//相应第二个人的分数
printf("%d\n",tmp1-tmp2);
scanf("%d",&n);
}
return 0;
}
相关文章推荐
- UVA - 10891 Game of Sum 区间DP(博弈DP)循环写法
- Game of Sum UVA - 10891(区间dp)
- 区间dp||记忆化搜索 Game of Sum UVA - 10891 or Light OJ 1031---Easy Game(区间DP)
- UVA 10891 Game of Sum 区间dp
- UVA - 10891 Game of Sum 区间DP(博弈DP)
- UVA - 10891 Game of Sum 区间DP博弈
- Uva 10891 Game of Sum - 区间DP..记忆化搜索
- UVA - 10891 Game of Sum 区间DP
- 28.uva 10891 Game of Sum 记忆化dp
- UVA 10891 Game of Sum(区间DP)
- uva 10891 sum游戏(区间dp)
- hdu 1024 Max Sum Plus Plus(DP->k段连续区间的最大和)
- UVA 10891 Game of Sum(区间DP)
- UVA 10891 Game of Sum(区间DP),
- UVa 10891 Game of Sum(经典博弈区间DP)
- uva_10891 - Game of Sum( 博弈区间DP )
- UVA 10891 Game of Sum(区间DP)
- UVa 10891 Game of Sum(博弈区间DP)
- UVA 10891 Game of Sum(区间DP)
- Uva 10891 Game of Sum(区间DP)