(点击此处查看原题)

题意

此处有n个位置,记为1~n,每个位置上都对应一个权值,乌龟从编号为1的位置出发,利用m张爬行卡片到达位置n,爬行卡牌有四种,分别可以让乌龟移动1,2,3,4步,并保证将m张牌全部用尽的时候,乌龟可以到达位置n,而乌龟每到达一个位置,就将获取这一位置的权值,问如何安排爬行卡牌的使用顺序,使得乌龟获得的总权值最大

解题思路

注意到乌龟用尽所有的爬行卡牌后将到达终点n,而且只能利用爬行卡牌从位置1开始移动,如果我们知道使用这张卡牌之前已经使用过每种卡牌多少个,那么每次使用任意一张爬行卡牌的时候,我们就很容易地找出转移方程,记dp[x1][x2][x3][x4]记录用了x1张步数为1的卡,x2张步数为2的卡,x3张步数为3的卡,x4张步数为4的卡的情况下获取的最大价值,同时也说明在位置 1 + x1 + 2 * x2 + 3 * x3 + 4 * x4 的最大价值是多少,那么转移方程为:

now = 1 + x1 + 2 * x2 + 3 * x3 + 4 * x4;

dp[x1][x2][x3][x4] = max(dp[x1][x2][x3][x4], dp[x1 - 1][x2][x3][x4] + val[now]);

dp[x1][x2][x3][x4] = max(dp[x1][x2][x3][x4], dp[x1][x2 - 1][x3][x4] + val[now]);

dp[x1][x2][x3][x4] = max(dp[x1][x2][x3][x4], dp[x1][x2][x3 - 1][x4] + val[now]);

dp[x1][x2][x3][x4] = max(dp[x1][x2][x3][x4], dp[x1][x2][x3][x4 - 1] + val[now]);

为了枚举dp数组的四个维度,我们先统计出四种爬行卡牌的总数,随后枚举四个维度,得到答案

代码区

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<string>
#include<fstream>
#include<vector>
#include<stack>
#include <map>
#include <iomanip> #define bug cout << "**********" << endl
#define show(x, y) cout<<"["<<x<<","<<y<<"] "
#define LOCAL = 1;
using namespace std;
typedef long long ll;
const int inf = 1e9 + ;
const ll mod = 1e9 + ;
const int Max = 1e6 + ; int n, m;
int val[Max];
int num[];
int dp[][][][]; //dp[x1][x2][x3][x4]记录用了x1张步数为1的卡,x2张步数为2的卡,x3张步数为3的卡,x4张步数为4的卡 int main()
{
#ifdef LOCAL
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++)
scanf("%d", val + i);
for (int i = , x; i <= m; i++)
scanf("%d", &x), num[x]++; dp[][][][] = val[]; //初始情况,自动获取第一个位置的值
for (int x1 = ; x1 <= num[]; x1++)
for (int x2 = ; x2 <= num[]; x2++)
for (int x3 = ; x3 <= num[]; x3++)
for (int x4 = ; x4 <= num[]; x4++)
{
int now = + x1 + * x2 + * x3 + * x4; //记录当前所在位置
if (x1 != )
dp[x1][x2][x3][x4] = max(dp[x1][x2][x3][x4], dp[x1 - ][x2][x3][x4] + val[now]);
if (x2 != )
dp[x1][x2][x3][x4] = max(dp[x1][x2][x3][x4], dp[x1][x2 - ][x3][x4] + val[now]);
if (x3 != )
dp[x1][x2][x3][x4] = max(dp[x1][x2][x3][x4], dp[x1][x2][x3 - ][x4] + val[now]);
if (x4 != )
dp[x1][x2][x3][x4] = max(dp[x1][x2][x3][x4], dp[x1][x2][x3][x4 - ] + val[now]);
}
printf("%d\n", dp[num[]][num[]][num[]][num[]]);
return ;
}

P1541 乌龟棋(动态规划)的更多相关文章

  1. P1541 乌龟棋 题解(洛谷,动态规划递推)

    题目:P1541 乌龟棋 感谢大神的题解(他的写的特别好) 写一下我对他的代码的理解吧(哎,蒟蒻就这能这样...) 代码: #include<bits/stdc++.h> #define ...

  2. 洛谷 p1541乌龟棋

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

  3. 【洛谷】P1541 乌龟棋(四维背包dp)

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

  4. codevs1068 乌龟棋==洛谷P1541 乌龟棋

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

  5. 洛谷P1541 乌龟棋 [2010NOIP提高组]

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

  6. 【题解】 Luogu P1541 乌龟棋总结 (动态规划)

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

  7. 洛谷 P1541 乌龟棋 Label:O(n^4)的dp

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

  8. dp——洛谷 P1541 乌龟棋 —— by hyl天梦

    题目:(转自 https://www.luogu.com.cn/problem/P1541) 题目描述 乌龟棋的棋盘是一行NN个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第NN格是 ...

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

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

  10. 洛谷 P1541 乌龟棋

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

随机推荐

  1. array_column()用法

    <?php $arr = [ [ 'id' => 1, 'name' => 'a' ],[ 'id' => 2, 'name' => 'b', ], [ 'id' =&g ...

  2. KDC添加加密

    零售KDC管理的域为TESTA.COM 华为集群管理的域为hadoop.com (目前测试了hdfs cli,下午在UAT集群测试下distcp) 一.            零售KDC升级支持AES ...

  3. 【洛谷4001】 [ICPC-Beijing 2006]狼抓兔子(最小割)

    传送门 洛谷 Solution 直接跑最小割板子就好了. 代码实现 #include<stdio.h> #include<stdlib.h> #include<strin ...

  4. Amdahl定律和可伸缩性

    性能的思考 提升性能意味着可以用更少的资源做更多的事情.但是提升性能会带来额外的复杂度,这会增加线程的安全性和活跃性上的风险. 我们渴望提升性能,但是还是要以安全为首要的.首先要保证程序能够安全正常的 ...

  5. 安装wget 、 wget命令

    今天给服务器安装新LNMP环境时,wget 时提示 -bash:wget command not found,很明显没有安装wget软件包.一般linux最小化安装时,wget不会默认被安装. 可以通 ...

  6. Raspberry PI 2上的802.11ac网卡驱动编译

    Raspberry PI 2上的802.11ac网卡驱动编译 最近在树莓派2上折腾视频,用来做FPV,但是发现2.4G的控会严重干扰2.4G WIFI,在开控的时候我的台式机+外置USB网卡都频频掉线 ...

  7. 2.使用kubeadm快速搭建k8s集群

    准备工作: 时间同步 systemctl stop iptables.servicesystemctl stop firewalld.service 安装docker wget https://mir ...

  8. django中iframe问题

    因为在django中无法识别我们普通的url格式,比如使用<iframe src="articles.html"></iframe>,这种格式django无 ...

  9. PCL点云库(Point Cloud Library)简介

    博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=29 什么是PCL PCL(Point Cloud Library)是在吸收了 ...

  10. WPF Win32 API 嵌入Form 窗体

    WIn32 API: public class Win32Native { [DllImport("user32.dll", SetLastError = true, CharSe ...