【NEFU 1325】宋哥的游戏

题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1325

这道题我一开始不会做,然后看题解也不会,差不多一周后,今天一看懂了

这是一颗树,一个节点有三个子节点,然后要求出根节点的最大值

从叶子节点开始回溯,根节点的值就出来了

然后比较一下就可以得到答案

#include <map>
#include <string>
#include <vector>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <cstring>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f

using namespace std;

const int maxn=10005;

int dp[maxn][200],a[maxn],sum[maxn];

int main()
{
    int t;
    scanf("%d",&t);
    string str;
    string pk[14]={"","A","2","3","4","5","6","7","8","9","10","J","Q","K"};
    for(int k=1;k<=t;k++)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            cin>>str;
            for(int j=1;j<=13;j++)
            {
                if(str==pk[j])
                {
                    a[i]=j;
                }
            }
        }
        sum[n+1]=0;
        for(int i=n;i>=1;i--)
        {
            sum[i]=sum[i+1]+a[i];
        }
        memset(dp,0,sizeof(dp));
        for(int i=n;i>=1;i--)
        {
            for(int j=1;j<150;j++)
            {
                dp[i][j]=sum[i]-max(dp[i+j][j],max(dp[i+j][j-1],dp[i+j][j+1]));
            }
        }
        if(2*dp[1][1]>sum[1])
        printf("Case #%d: Song\n",k);
        if(2*dp[1][1]==sum[1])
        printf("Case #%d: Again\n",k);
        if(2*dp[1][1]<sum[1])
        printf("Case #%d: Takeout\n",k);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值