题目链接

题目

题目描述

​ 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。

​ 乌龟棋的棋盘是一行N 个格子,每个格子上一个分数(非负整数)。棋盘第1 格是唯一的起点,第N 格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。

​ 乌龟棋中M 张爬行卡片,分成4 种不同的类型(M 张卡片中不一定包含所有4 种类型的卡片见样例),每种类型的卡片上分别标有1、2、3、4 四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行相应的格子数。游戏中,玩家每次需要从所有的爬行卡片中选择一张之前没有使用过的爬行卡片,控制乌龟棋子前进相应的格子数,每张卡片只能使用一次。游戏中,乌龟棋子自动获得起点格子的分数,并且在后续的爬行中每到达一个格子,就得到该格子相应的分数。玩家最终游戏得分就是乌龟棋子从起点到终点过程中到过的所有格子的分数总和。

​ 很明显,用不同的爬行卡片使用顺序会使得最终游戏的得分不同,小明想要找到一种卡片使用顺序使得最终游戏得分最多。

​ 现在,告诉你棋盘上每个格子的分数和所有的爬行卡片,你能告诉小明,他最多能得到多少分吗?

输入描述

第1行2个正整数N和M,分别表示棋盘格子数和爬行卡片数。第2行N个非负整数,\(a_1, a_2,\cdots , a_N\),其中ai表示棋盘第i个格子上的分数。

第3行M个整数,\(b_1,b_2, \cdots , b_M\) ,表示M张爬行卡片上的数字。

输入数据保证到达终点时刚好用光M张爬行卡片,即 \(N-1= \sum_{1}^Mb_i\)

输出描述

输出只有1行,1个整数,表示小明最多能得到的分数。

示例1

输入

9 5
6 10 14 2 8 8 18 5 17
1 3 1 2 1

输出

73

说明

小明使用爬行卡片顺序为1,1,3,1,2,得到的分数为6+10+14+8+18+17=73。注意,

由于起点是1,所以自动获得第1格的分数6。

示例2

输入

13 8
4 96 10 64 55 13 94 53 5 24 89 8 30
1 1 1 1 1 2 4 1

输出

455

备注

对于30%的数据有1≤N≤30,1≤M≤12。对于50%的数据有1≤N≤120,1≤M≤50,且4种爬行卡片,每种卡片的张数不会超过20。

对于100%的数据有1≤N≤350,1≤M≤120,且4种爬行卡片,每种卡片的张数不会超过40;

\(0≤a_i≤100,1≤i≤N\) ;\(1≤b_i≤4,1≤i≤M\) 。输入数据保证 \(N-1= \sum_{1}^Mb_i\)

题解

知识点:线性dp。

考虑 \(dp[i][j][k][l]\) 为第一、二、三、四种卡分别用了 \(i,j,k,l\) 张。显然有转移方程:

\[dp[i][j][k][l] = \max
\left \{
\begin{aligned}
dp[i-1][j][k][l]\\
dp[i][j-1][k][l]\\
dp[i][j][k-1][l]\\
dp[i][j][k][l-1]\\
\end{aligned}
\right \}
+a[d],d=i+2j+3k+4l+1
\]

注意一下边界即可。

时间复杂度 \(O(N)\)

空间复杂度 \(O(M+N^4)\)

代码

#include <bits/stdc++.h>

using namespace std;

int a[357], b[10], dp[107][107][107][107];

int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m;
cin >> n >> m;
for (int i = 1;i <= n;i++) cin >> a[i];
for (int i = 1, tmp;i <= m;i++) cin >> tmp, b[tmp]++;
for (int i = 0;i <= b[1];i++) {
for (int j = 0;j <= b[2];j++) {
for (int k = 0;k <= b[3];k++) {
for (int l = 0;l <= b[4];l++) {
int d = i + j * 2 + k * 3 + l * 4 + 1;
dp[i][j][k][l] = max(
{
dp[max(0,i - 1)][j][k][l],
dp[i][max(0,j - 1)][k][l],
dp[i][j][max(0,k - 1)][l],
dp[i][j][k][max(0,l - 1)]
}
) + a[d];
}
}
}
}
cout << dp[b[1]][b[2]][b[3]][b[4]] << '\n';
return 0;
}

NC16590 [NOIP2010]乌龟棋的更多相关文章

  1. NOIP2010乌龟棋[DP 多维状态]

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...

  2. NOIP2010 乌龟棋

    2乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌 ...

  3. CH5E01[NOIP2010] 乌龟棋[暴力]

    众所周知,由于这个人太菜了,所以她又来切上古水题了. 显然最多$40^4$种状态,暴力跑出可以拼出多少种状态,然后按序号从小到大对应的状态瞎转移即可. 我知道我想繁了,但是不想改了,因为思路一出来,没 ...

  4. tyvj 1402 乌龟棋 dp

    P1402 [NOIP2010]乌龟棋 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2010提高组复赛第二题 描述 小明过生日的时候,爸爸送给他一 ...

  5. NOIP2010提高组乌龟棋 -SilverN

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...

  6. CJOJ 1087 【NOIP2010】乌龟棋 / Luogu 1541 乌龟棋(动态规划)

    CJOJ 1087 [NOIP2010]乌龟棋 / Luogu 1541 乌龟棋(动态规划) Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个 ...

  7. [NOIP2010] 提高组 洛谷P1541 乌龟棋

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...

  8. 【NOIP2010】【P1317】乌龟棋

    似乎很像搜索的DP(应该也可以用搜索写) 原题: 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物.乌龟棋的棋盘是一行N 个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N 格是终点, ...

  9. 【洛谷1541】【CJOJ1087】【NOIP2010】乌龟棋

    题面 Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌 ...

  10. luoguP1541 乌龟棋 题解(NOIP2010)

    P1541 乌龟棋 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<cma ...

随机推荐

  1. Elasticsearch 索引与文档的常用操作总结一

    本文为博主原创,未经允许不得转载: ES 的 Restful风格: Restful是一种面向资源的架构风格,可以简单理解为:使用URL定位资源,用HTTP动词(GET,POST,DELETE,PUT) ...

  2. [转帖]SecurityProtocolType 枚举

    https://learn.microsoft.com/zh-cn/dotnet/api/system.net.securityprotocoltype?view=net-8.0 命名空间: Syst ...

  3. [转帖]JVM相关 - StackOverflowError 与 OutOfMemoryError

    https://zhuanlan.zhihu.com/p/265039643   7 人赞同了该文章 本文基于 Java 15 StackOverflowError 与 OutOfMemoryErro ...

  4. [转帖]OceanBase 中租户管理

    https://zhuanlan.zhihu.com/p/464504887 概述 租户的概念类似于传统数据库的数据库实例.租户也叫实例,拥有一定的资源能力(如CPU.内存和空间).租户下可以建立数据 ...

  5. [转帖]TiDB之修改root密码

    https://www.modb.pro/db/337530 当忘记TiDB root 密码时,可以通过设置skip-grant-table参数来跳过密码验证,登录成功以后再修改root密码. 方法一 ...

  6. [转帖]iostat相关参数说明——await:平均每次设备I/O操作的等待时间 (毫秒),如果%util接近 100%,说明产生的I/O请求太多

    https://www.cnblogs.com/bonelee/p/6323587.html iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动 ...

  7. 国产飞腾2000+服务器 存储单盘性能简单验证 SSD 与 HDD

    有kylinV10的源 可以直接安装fio yum install fio -y 第一步, 将sdd 进行初始化,并且设置文件系统 fdisk /dev/sdbmkdir /ssd2 mkfs.ext ...

  8. 依据HTML标准再探Javascript事件循环及其与浏览器渲染的关系

    Javascript的一些基础概念 JavaScript执行引擎在宿主环境中是单线程的,这意味着在同一时间内只能执行一个任务.在Javascript运行期间,引擎会创建和维护相应的堆(heap)和栈( ...

  9. uni-app 长按事件 事件目标元素 手机运行uni-app

    longpress 长按就会触发哈 <view @click="clickTest">点击</view> <view @longpress=" ...

  10. vm-storage在新metric占整体1%情况下的写入性能测试

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 根据正式环境实际的数据统计,全新的metric占整体的me ...