乌龟棋----dp//dfs

题解:洛谷 P1541 [NOIP 2010 提高组] 乌龟棋 四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数。游戏中,玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片,控制乌龟棋子前进相应的格子数,每张卡片只能使用一次。游戏中,乌龟棋子自动获得起点格子的分数,并且在后续的爬行中每到达一个格子,就得到该格子相应的分数。很明显,用不同的爬行卡片使用顺序会使得最终游戏的得分不同,小明想要找到一种卡片使用顺序使得最终游戏得分最多。现在,告诉你棋盘上每个格子的分数和所有的爬行卡片,你能告诉小明,他最多能得到多少分吗?张爬行卡片上的数字。 阅读详情

思路:
 

首先说这道题很明显能看出来是一道dp啊,但是本人没看清题,没看到只有四个数,不会做

遂使用暴力大法

### 暴力大法好!!!!!!

说回来这道题的的dfs还死活非常好写的哈

首先我们需要一个vis来标记每张牌是不是已经用过了,然后我们就按找“找哪个”的思路去做就好了

## 强烈推荐大家去看b上灵山的视频,关于dfs与dp讲的太好了!二者丝滑转换(我还做不到)

def dfs(i, s):
    global ans,a
    if i == n-1:
        ans += score[n-1]
        a = max(a,ans)
        ans -= score[n-1]
        return
    ans += score[i]
    for ind, j in enumerate(card):
        if vis[ind] != -1:
            vis[ind] = -1
            path.append(j)
            dfs(j + i, ans)
            path.pop()
            vis[ind] = 1
    ans -= score[i]

当然,dfs的时间复杂度是不能通过这道题的,现在我们思考dp

首先当然是找状态(ps.我每次想不出来我就现在脑海里构建一个dfs的框架,然后以dfs每次的状态作为状态基本就错不了,没办法,实在是想不出来)

所以我们的状态就是当前处在的格子所积攒的分数

其次就是找状态转移方程:

这时候我们要注意一件事,就是只有四个分数的牌,而我们如果不考虑这个条件,而是把所有的card的话是找不到状态转移方程的(也可能是我实在是太弱了)

然后我们构建的状态就是:

dp[i][j][k][g]

这代表着已经使用了i张走一步的,j张走两步的……以此类推

状态转移方程也可以很轻松的找到:

dp[i][j][k][g] = max(dp[i-1][j][k][g], dp[i][j-1][k][g], dp[i][j][k-1][g], dp[i][j][k][g-1],dp[i][j][k][g])

这道题就做完啦!总的来说这道题还是非常简单的

代码

n, m = map(int,input().split())
score = list(map(int, input().split()))
card = list(map(int, input().split()))

# 一共走m步,选哪个的问题,n个格子
# dp[i] = max(dp[i-k],dp[i])
vis = [1] * (n + 1)
dp = [0] * n

def dfs(i, s):
    global ans,a
    if i == n-1:
        ans += score[n-1]
        a = max(a,ans)
        ans -= score[n-1]
        return
    ans += score[i]
    for ind, j in enumerate(card):
        if vis[ind] != -1:
            vis[ind] = -1
            path.append(j)
            dfs(j + i, ans)
            path.pop()
            vis[ind] = 1
    ans -= score[i]

vis = [1] * (n + 1)
# 四维dp
# dp[i][j][k][g]:只有四个数
a = b= c= d =0
for i in card:
    if i == 1:
        a += 1
    if i == 2: b += 1
    if i == 3: c += 1
    if i == 4: d += 1

dp = [[[[0] * (d+1) for _ in range(c+1)]for _ in range(b+1)]for _ in range(a+1)]
# dp[i] = max(dp[i-k] + score[i], dp[i])
for i in range(a+1):
    for j in range(b+1):
        for k in range(c+1):
            for g in range(d+1):
                cur = i + 2 * j + 3 * k + 4 * g

                dp[i][j][k][g] = max(dp[i-1][j][k][g], dp[i][j-1][k][g], dp[i][j][k-1][g], dp[i][j][k][g-1],dp[i][j][k][g])
                dp[i][j][k][g] += score[cur]

print(dp[a][b][c][d])

中图法第五版SQL,支持树形结构可直接导入使用 基于第五版中图法官方数据收集整理,效果图如下: 阅读详情

相关推荐

【STM32F042】使用NTC热敏电阻实现温度测量

1.NTC介绍 NTC是负温度系数的简写,全称是Negative temperature coefficient.意思是随着温度的升高,电阻值呈现下降趋势。常用作温度传感器。这里有一个式子表示负温度系数的电阻值: RT=R0*exp(B (1/T-1/T0)) RT为周围温度为T (K) 时的电阻值,R0是周围温度为T0(K) 时的电阻值,注意这里的温度是开...

BadBoyHolly的博客 3万+

【NOIP2010】【DP】T2 乌龟棋 题解

2.乌龟棋 (tortoise.pas/c/cpp) 【问题描述】 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。 乌龟棋的棋盘是一行N 个格子,每个格子上一个分数(非负整数)。棋盘第1 格是唯一 的起点,第N 格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。乌龟棋中M 张爬行卡片,分成4 种不同的类型(M 张卡片中不一定包含所有4 种类型 的卡片,见样例),每种类型的卡片上

It's Maverick. 574

CentOS7下Ollama部署全攻略:从安装到自定义端口配置(附国内加速技巧)

本文详细介绍了在CentOS7系统上部署Ollama的完整流程,包括环境准备、模型下载优化、服务化部署及端口配置等关键步骤。特别针对国内网络环境提供了加速安装方案和镜像源配置技巧,帮助开发者快速搭建稳定的本地AI运行环境。

mmm90的博客 289

计蒜客-2098-乌龟棋-四维dp

小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。 乌龟棋的棋盘是一行 NN 个格子,每个格子上一个分数(非负整数)。棋盘第 11 格是唯一的起点,第 NN 格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。 乌龟棋中 MM 张爬行卡片,分成 44 种不同的类型(MM 张卡片中不一定包含所有 44 种类型的卡片见样例),每种类型的卡片上分别标有 11、22、33、44 四个数字之一,表示使用...

小吴同学的博客 545

PM1132-220V转5V电源芯片:SOT-23-3封装的高效电源解决方案

在现代电子设备小型化和高效化的趋势下,PM1132芯片凭借其的能力与特性,成为工业控制IoT设备及便携电器的理想电源管理方案。以下从核心技术设计挑战和应用实践展开分析。

M_D13Z476I000l的博客 806

NR PUCCH(二)PUCCH format 2/3/4

继续看PUCCH2/3/4:PUCCH format 0和1所携带的信息bits少,UCI bits2bits,信息bit需要经过编码等过程下面分别来看。

ModemProtocol的博客 539

NOIP 2010 提高组 复赛 第二题 乌龟棋 tortoise AC代码(多种状态的动态规划dp)+20分代码(深搜dfs)

NOIP 2010 提高组 复赛 第一题 乌龟棋 tortoise 30分代码(深搜dfs) 总目录详见:NOIP 提高组 复赛 试题 目录 信奥 历年 在线测评地址:https://www.luogu.com.cn/problem/P1541 1.多种状态的动态规划dp 1.f[a][b][c][d]:表示你出了a张爬行牌1,b张爬行牌2,c张爬行牌3,d张爬行牌4时的得分 2.cnt[x]:表示牌x一共有多少张 题干中说如何出牌,那我们就不妨DP一下每一种牌的出牌张数 初始化: ...

mrcrack的博客 657

AUTOSAR进阶图解==>AUTOSAR_SWS_CANStateManager

AUTOSAR CAN状态管理器(CanSM)摘要 CanSM是AUTOSAR通信栈中的关键模块,负责管理CAN网络状态和模式转换。主要功能包括: 控制CAN控制器/收发器工作模式(STARTED/STOPPED,NORMAL/STANDBY) 处理三种网络状态(全通信、静默通信、无通信)之间的转换 监控和处理总线关闭(Bus-Off)事件 与ComM、CanIf、BswM等模块协同工作 CanSM通过状态机管理网络状态转换,支持可配置的总线关闭恢复策略。它为每个CAN网络维护独立的状态机,实现网络状态的精

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 5580

动态规划经典题解析:从乌龟棋看多维DP状态定义与优化

动态规划是解决最优化问题的核心算法范式,其关键在于将复杂问题分解为重叠子问题,并通过状态与状态转移高效求解。理解状态定义是掌握动态规划的重中之重,它需要精准捕捉影响未来决策的关键变量。在工程实践中,面对资源分配、路径规划等场景,多维动态规划通过增加状态维度来消除后效性,是处理多约束条件的利器。本文以经典题目“乌龟棋”为切入点,深入剖析如何将棋盘位置问题转化为对四种卡片消耗量的四维DP建模,其状态转移清晰展现了资源消耗型DP的通用思路。通过这道题,开发者可以深刻领会状态压缩的思想,并学会在算法竞赛和实际工程中

weixin_34337381的博客 408

【ComfyUI专栏】ComfyUI 常用工作流下载与分享网址

首先我们来分享第一个网站,Openart 网站,这个网站同时也能提供比较多的其他类型。但是如果希望下载工作流,我们可以访问到如下的这个站点。作为ComfyUI的学习用户来说,我们通常需要借助他山之石来帮助我们快速成长,因此我们需要找到能够分享和下载的网址。,当前网站是综合性网站,在网站中可以下载各种不同的类型,其中工作流只是可以下载的非常小的部分。这个网站也可以浏览不同的工作流,这个工作流的地址和访问如下的站点。

技术与管理的平衡木- 7812

Python爬招聘网站:Selenium+ActionChains破解滑动验证码,批量采集岗位数据(新手可跑)

通过本文实战,你不仅学会了用Selenium+ActionChains破解滑动验证码,还掌握了爬虫的核心优化思路——“模拟人类行为”是突破反爬的关键。这套逻辑不仅适用于招聘网站,还能迁移到其他有滑动验证码的平台(如电商、资讯网站)。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1188

P1541 乌龟棋(四维动归)

题目描述 乌龟棋的棋盘是一行 NN 个格子,每个格子上一个分数(非负整数)。棋盘第1格是唯一的起点,第 NN 格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。 乌龟棋中 MM 张爬行卡片,分成4种不同的类型( MM 张卡片中不一定包含所有 44 种类型的卡片,见样例),每种类型的卡片上分别标有 1,2,3,41,2,3,4 四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数...

Allen的博客 269

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【每日一题】乌龟棋

乌龟棋:记忆化搜索 https://ac.nowcoder.com/acm/problem/16590 思路:看数据范围是350,每一步的选择有四种,可以采用dp递推,也可以记忆化搜索。 记忆化搜索:设置状态dp[a][b][c][d] 表示用了a个1,b个2,c个3,d个4的最优解。 然后对于每一步搜索四种情况 #include <bits/stdc++.h> #define ull unsigned long long #define ll long long const int

qq_46653910的博客 188

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

洛谷P1541/CODEVS1068 乌龟棋

本题地址: http://www.luogu.org/problem/show?pid=1541 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数)。棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。 乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类

辣鸡退役选手的博客 874

乌龟棋

题目描述 Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数)。棋盘第1格是唯一 的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。 …… 1 2 3 4 5 ……N 乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型 的卡片,见样例),每种类型的卡片上分别标有

Rookie的博客 742

乌龟棋 dp

// 乌龟棋.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include<algorithm> #include<cstring> #include<string> using namespace std; const int maxn = 50; int f[maxn][maxn][maxn][maxn]; int number[100000]; int M[10]; bool

weixin_45640360的博客 164

[noip模拟]四道题 noip2010 机器翻译 noip2010 乌龟棋 noip 关押罪犯 noip 引水入城

NOIP2010题解

Lazer2001 743

洛谷P1541 乌龟棋

题目背景小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。题目描述乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数)。棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型的卡片,见样例),每种类型的卡片上分别标有1、2、3、4四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格...

weixin_38199770的博客 175

Luogu1541[NOIp2010 TG] 乌龟棋

原题链接:https://www.luogu.org/problemnew/show/P1541 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数)。棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。 乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡...

ShadyPi的IT笔记 242

【noip 2009】 乌龟棋 记忆化搜索&动规

题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数)。棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。 乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型的卡片,见样例),每种类型的卡片上分别标有1、2、3、4四个数字之一,表示使用这种卡片后,乌龟棋...

weixin_33869377的博客 117

noip2010T2乌龟棋

2.乌龟棋 (tortoise.pas/c/cpp) 【问题描述】 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数)。棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。 …… 1 2 3 4 5……N 乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型的卡片,见

Ostmbh的博客 413

[NOIP2010]机器翻译,乌龟棋,关押罪犯,引水入城

今天考了一套10年的NOIP真题,虽然比2016年 的要简单许多,但还是没有做好。 第一题 机器翻译 (translate.pas/c/cpp) 【问题描述】 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义 来替换。对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有

Unlimited Code Works 633

codevs1068乌龟棋-四维DP,五维如何缩减一维

我们从起点x开始暴力枚举所有决策 于是可以得到如下转移 void dfs(int x,int A,int B,int C,int D,int y) { if (x==n) {ans=max(ans,y);} if (A) dfs(x+1,A-1,B,C,D,y+a[x+1]); if (B) dfs(x+2,A,B-1,C,D,y+a[x+2]); if (C) ...

weixin_30809333的博客 131

动态规划实战:四维状态设计解洛谷P1541乌龟棋

动态规划(DP)是解决最优化问题的核心算法思想,其原理在于将复杂问题分解为重叠子问题,并通过存储子问题的解来避免重复计算,从而提升效率。在算法竞赛和工程实践中,DP常用于资源分配、路径规划等场景。理解状态设计是掌握DP的关键,它决定了问题的可解性和算法效率。本文以洛谷经典题目P1541乌龟棋为例,深入剖析如何将“位置”和“卡片使用情况”等多维约束,精妙地转化为四维DP状态 `dp[a][b][c][d]`,实现了从指数级搜索到多项式时间复杂度的优化。通过详解状态转移方程、代码实现(含C++示例)及常见调试技

weixin_34189116的博客 415
上一篇: 方格取数python
下一篇: (python)P3147 [USACO16OPEN] 262144 P ----dp
我爱洛谷!!!
博客等级 码龄6年 25粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值