Free Candies UVA - 10118

本文介绍了一款基于策略的游戏,玩家需要从四堆糖果中取糖果放入篮子,目标是将尽可能多的糖果转移到口袋中。使用记忆化搜索算法和四维数组实现,关键在于维护篮子中糖果的状态并最大化收集的糖果数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:桌上有四堆糖果,每堆有N(N<=40)颗。佳佳有一个最多装5颗糖果的篮子。他每次选择一堆糖果,把最顶上的一颗拿到篮子里。如果篮子里有两颗颜色相同的糖果,佳佳就把它们从篮子里拿出来放到自己的口袋里。如果篮子满了而里面又没有相同颜色的糖果,游戏结束,口袋里的糖果就归他了。当然如果佳佳足够聪明,他有可能把堆里的所有糖果都拿走。为了拿到尽量多的糖果,佳佳该怎么做呢?

思路:记忆化搜索,第一次看见四维数组。

1.在每次调用dfs时传入五个数,分别表示每堆糖果该选第几颗,还有篮子里糖果的数量

2.用一个no数组,no[i]表示篮子里是否有颜色为i的糖果,如果有,则把糖果放到口袋里,修改no[i],cnt - 1.

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
const int maxn = 42;
int n,g[5][maxn];
int vis[maxn],no[5];//每堆糖果选到第几了
int dp[maxn][maxn][maxn][maxn];//得到的糖果数
int dfs(int a,int b,int c,int d,int cnt)
{
//    no[0] = a,no[1] = b,no[2] = c,no[3] = d;
    int & ans = dp[a][b][c][d];
    if(ans || cnt >= 5) return ans;
    no[0] = a,no[1] = b,no[2] = c,no[3] = d;
    for(int i = 0;i < 4;i++)
    {
        if(no[i] >= n) continue;
        int x = g[i][no[i]];
        no[i]++;
        if(!vis[x])
        {
            vis[x] = 1;
            ans = max(ans,dfs(no[0],no[1],no[2],no[3],cnt + 1));
            vis[x] = 0;
        }
        else
        {
            vis[x] = 0;
            ans = max(ans,dfs(no[0],no[1],no[2],no[3],cnt - 1) + 1);
            vis[x] = 1;
        }
        no[i]--;
    }
    return ans;
}
int main()
{
    while(scanf("%d",&n) && n)
    {
        memset(dp,0,sizeof(dp));
        memset(vis,0,sizeof(vis));
        for(int i = 0;i < n;i++)
        {
            for(int j = 0;j < 4;j++)
            {
                scanf("%d",&g[j][i]);
            }
        }
        printf("%d\n",dfs(0,0,0,0,0));
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值