首页 > 其他分享 >P1541 乌龟棋

P1541 乌龟棋

时间:2022-12-25 13:44:07浏览次数:49  
标签:分数 int 卡牌 P1541 乌龟 数量

P1541 乌龟棋

题意

一共有 \(N\) 个格子,每个格子上有一个分数,一共有四种卡牌: \(1,2,3,4\) ,使用一种卡牌之后,乌龟将前进对应的长度。每张卡牌只能使用一次,乌龟的起点为 \(1\) ,现在给出各个格子上的分数,以及卡牌的数量,保证乌龟用完所有卡牌之后刚好到达终点,求乌龟到达终点时获得的最大分数是多少?

思路:

到达一个点时,有四种操作,分别是选择四种卡牌中的一种,所以想到动态规划,最直接的状态定义为 \(f[i][a][b][c][d]\) 表示到达第 \(i\) 个点,第一种卡牌数量为 \(a\) ,第二种卡牌数量为 \(b\) ,第三种卡牌数量为 \(c\) ,第四种卡牌数量为 \(d\) 时,获得的最大分数。

但是根据数据范围分析时间复杂度可知,这样的状态定义会 MLE 并且会 TLE,所以就想还有哪里可以优化一下。这时候可以发现,当我们知道使用卡牌的情况的时候,其实我们就可以知道当前乌龟到达了哪个点,这样第一维度其实就没有任何意义。那么剩下后面四维的话,是满足题目时限的。

定义 \(f[a][b][c][d]\) : 第一种卡牌数量为 \(a\) ,第二种卡牌数量为 \(b\) ,第三种卡牌数量为 \(c\) ,第四种卡牌数量为 \(d\) 时,到终点可以获得的最大分数。

实现:

#include <bits/stdc++.h>
using namespace std;
const int N = 45, M = 255;
int a[M];
int f[N][N][N][N];
int b[5], c[5];

int dp(int b[])
{
    if (f[b[1]][b[2]][b[3]][b[4]])
        return f[b[1]][b[2]][b[3]][b[4]];

    int mmax = 0;
    for (int i = 1; i <= 4; i++)
    {
        if (b[i])
        {
            b[i]--;
            int to = 1;
            for (int j = 1; j <= 4; j++)
            {
                to += j * (c[j] - b[j]);
            }
            mmax = max(mmax, dp(b) + a[to]);
            b[i]++;
        }
    }
    return f[b[1]][b[2]][b[3]][b[4]] = mmax;
}

int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);

    for (int i = 1; i <= m; i++)
    {
        int x;
        scanf("%d", &x);
        b[x]++;
        c[x]++;
    }

    printf("%d\n", dp(b) + a[1]);
    return 0;
}

标签:分数,int,卡牌,P1541,乌龟,数量
From: https://www.cnblogs.com/zxr000/p/17003936.html

相关文章

  • 《【答案】芝诺的乌龟是哪一步被追上的?》 回复
    《【答案】芝诺的乌龟是哪一步被追上的?》     https://tieba.baidu.com/p/8084787932      35楼K歌之王:回复Excalibur!:你的这个问题物空大师......
  • P1541 [NOIP2010 提高组] 乌龟棋
    [NOIP2010提高组]乌龟棋题目背景小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。题目描述乌龟棋的棋盘是一行\(N\)个格子,每个格子上一个分数(非负整数)。棋盘第1格是......
  • Git小乌龟的安装及使用
    https://www.jianshu.com/p/33108325fc871安装git2安装TortoiseGit和语言包3github官网,代码托管4代码开发流程 1切换到master分支 2获取master分支最新代码 3创建子分支 4......
  • 小乌龟(TortoiseGit)在push时总是要求输入密码的解决办法
    当你在用TortoiseGit拉取或者提交代码的时候,可能遇到过git小乌龟总是要让你输入密码,无法拉取、提交代码,见下图。怎么解决这个问题? 1.复制私钥文件id_rsa,将复制的文件......
  • 做题记录整理dp1 P1541. [NOIP2010 提高组] 乌龟棋(2022/9/20)
    P1541.[NOIP2010提高组]乌龟棋把每个牌选多少个塞进dp的四个维度里,就可以做到无后效性了#include<bits/stdc++.h>usingnamespacestd;#definefor1(i,a,b)for(ll......
  • 使用小乌龟进行团队项目开发-05
    前面几节说了如何使用小乌龟的基本操作以及怎么在Gitee里创建私人仓库,那么同团队之间怎么进行协作开发的?这就要在Gitee上添加仓库成员,因为我们设置得仓库都是私有的,只有仓......
  • 使用小乌龟更新代码到远程仓库-04
    通过push可将本地仓库代码上传到远程仓库  设置一下远程仓库地址,点击上面的Manage  确定即可,之后就按照正常的push就可以将代码上传到远程仓库了。 ......
  • 使用小乌龟解决版本冲突问题-03
    如果一个团队两个人共同修改了同一个文件,例如我修改了pom.xml文件,另外一个也修改了pom.xml文件,那么他提交后,我再下拉得时候就会冲突,提示mergeconfict。小乌龟提交代码到......
  • 使用小乌龟来更新代码-02
    小乌龟更新代码使用的是pull右击项目文件,TortoiseGit--->pull来更新代码,从远程仓库拉取最新的代码,拉取后。  点击OK 然后点击PulledDiff,点击Showlog看看当前版......
  • 5 - Windows端Git可视化工具TortoiseGit(小乌龟)
     TortoiseGit是一个开放的Git版本控制系统的源客户端,只运行于Windows系统中,与操作系统紧密结合,使用起来非常方便 一、TortoiseGit的下载安装1、TortoiseGit软件链接:h......