喵哈哈村的挑衅

Problem Description

喵哈哈村就挨着哗啦啦村,他们很喜欢和哗啦啦村互黑~
今天也不例外,喵哈哈派了智商流选手 青君 去挑衅哗啦啦村
哗啦啦村当然不会畏惧这种弱的挑衅,于是派出了谈笑风生的 狗哥 应战!
青君和狗哥站在一个空地上,空地上有两排物品,每排都有n个,每个物品都有一定价值
每次每个人只能拿第一排的最左边的物品,或者拿第一排最右边的物品,或者第二排最左边的物品,或者第二排最右边的物品
狗哥 和 青君轮流拿~
青君先手,请问在狗哥绝顶聪明的情况下,青君所拿物品的最大价值是多少?
Input

多组测试数据,最多100组
第一行 一个数字n,表示每排有多少个物品。
第二行 n个数字,a[i]表示第一排,第i个物品的价值是多少
第三行 n个数字,b[i]表示第二排,第i个物品的价值是多少
1<=n<=25 1<=a[i]<=1000 1<=b[i]<=1000
Output

对于每组测试数据,输出一个整数,表示青君所能获得的最大价值是多少
Sample Input

1
23
53
3
10 100 20
2 4 3
Sample Output

53
105
一个博弈感觉的题目,每个人都是要拿当前最优的,那么写一个函数f,每个人都是拿f的,f里放四个常数,表示两排数的左右位置,表示取到什么地方了,状态只有四个,l1+1,l2+1,r1-1,r2-1;那么算出状态中最小的值,也就是让下一个人取其中的最小值,自己就一定是取到最大值,就向这个状态转移。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int a[30],b[30],leap[30][30][30][30],dp[30][30][30][30];
int f(int l1,int r1,int l2,int r2)
{
    if(leap[l1][r1][l2][r2])
    return dp[l1][r1][l2][r2];
    leap[l1][r1][l2][r2]=1;
    int sum = 0;
    int i;
    if(l1<=r1)
    {
        for(i=l1;i<=r1;i++)
        sum+=a[i];
    }
    if(l2<=r2)
    {
        for(i=l2;i<=r2;i++)
        sum+=b[i];
    }
    int ans=0;
    if(l1<=r1)
    {
        ans=max(ans,sum-f(l1+1,r1,l2,r2));
        ans=max(ans,sum-f(l1,r1-1,l2,r2));
    }
    if(l2<=r2)
    {
        ans=max(ans,sum-f(l1,r1,l2+1,r2));
        ans=max(ans,sum-f(l1,r1,l2,r2-1));
    }
    dp[l1][r1][l2][r2]=ans;
    return ans;
}
int main()
{
    int i, j, m, n, ans, t;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=1;i<=n;i++)
        cin>>a[i];
        for(i=1;i<=n;i++)
        cin>>b[i];
        memset(leap,0,sizeof(leap));

        cout<<f(1,n,1,n)<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值