uva 1291(dp)[通俗易懂]

uva 1291(dp)

大家好,又见面了,我是全栈君。

题意:有一台跳舞机,中间是0。上左下右分别代表1 2 3 4,初始状态人站在中间。两仅仅脚都踏在0上,然后给出一段序列以0为结束,要按顺序踩出来,从0踏到四个方向须要消耗2点能量,从一个方向到相邻的方向消耗3点能量,从一个方向到对面方向消耗4点能量,在一个方向原地再踩一次消耗1点能量,问把全部序列踩完最少消耗多少能量。
题解:f[i][j][k]表示踩前i步左脚在方向j上右脚在方向k上最少消耗多少能量。那么就要分两种情况讨论:
(1)f[i][j][a[i]] 的前一步是f[i – 1][a[i – 1]][k]或f[i – 1][k][a[i – 1]]。这两种情况再加上这一步移动消耗能量取较小值。
(2)f[i][a[i]][j]和上面相似
结果在f[n][a[n]][k]和f[n][k][a[n]]中取最小值就是解。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 100000;
int n, a[N], f[N][5][5];

int Count(int x, int y) {
    if (x == 0)
        return 2;
    int temp = fabs(x - y);
    if (temp == 0)
        return 1;
    if (temp % 2)
        return 3;
    return 4;
}

int main() {
    while (1) {
        n = 1;
        scanf("%d", &a[n]);
        if (a[n] == 0)
            break;
        while (a[n]) {
            n++;
            scanf("%d", &a[n]);
        }
        n--;
        memset(f, INF, sizeof(f));
        f[0][0][0] = 0;
        for (int i = 1; i <= n; i++) {
            for (int j = 0; j <= 4; j++) {
                if (j != a[i]) {
                    if (a[i - 1] == j) {
                        for (int k = 0; k <= 4; k++)
                            if (k != a[i - 1] || i == 1) {
                                f[i][j][a[i]] = min(f[i][j][a[i]], f[i - 1][j][k] + Count(k, a[i]));
                                f[i][a[i]][j] = min(f[i][a[i]][j], f[i - 1][k][j] + Count(k, a[i]));
                            }
                    }
                    else {
                        f[i][j][a[i]] = min(f[i][j][a[i]], f[i - 1][j][a[i - 1]] + Count(a[i - 1], a[i]));
                        f[i][a[i]][j] = min(f[i][a[i]][j], f[i - 1][a[i - 1]][j] + Count(a[i - 1], a[i]));
                    }
                }
            }
        }
        int res = INF;
        for (int i = 1; i <= 4; i++) {
            res = min(res, f[n][i][a[n]]);
            res = min(res, f[n][a[n]][i]);
        }
        printf("%d\n", res);
    }
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115768.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 10个的常用PyCharm插件

    10个的常用PyCharm插件安装方法先来说说插件的安装方法,一点都不难。选择顶部菜单栏的PyCharm选项,打开Preferences,点击plugins,在右侧的文本框中输入想要查看的插件名称,在下方就会罗列出已经安装的相关的插件。找到我们所需要的对应插件之后,点击install即可完成下载,然后重启一下Pycharm即可插件介绍1、MaterialThemeUILite该插件的作用在于能够为Pycharm提供多种不同的页面风格。设置:选择顶部菜单栏的PyCharm选项,打开Pref

    2022年6月24日
    63
  • [教程] 《Mysql 实战 45 讲》[通俗易懂]

    [教程] 《Mysql 实战 45 讲》

    2022年2月17日
    137
  • linux mail发邮件_python邮件发送

    linux mail发邮件_python邮件发送linux安装mailx发邮件文章目录linux安装mailx发邮件原理安装配置qq的smtps服务器配置Peer的证书发布者为信任​ mail命令是Linux终端发送邮件用的最多的命令。mailx是mail命令的更新版本,基于BerkeleyMail8.1,意在提供POSIXmailx命令的功能,并支持MIME、IMAP、POP3、SMTP和S/MIME扩展。mailx在某些交互特性上更加强大,如缓冲邮件消息、垃圾邮件评分和过滤等。在Linux发行版上,mail

    2022年10月20日
    3
  • 关于输入阻抗和输出阻抗的理解是_输入阻抗和输出阻抗

    关于输入阻抗和输出阻抗的理解是_输入阻抗和输出阻抗输入阻抗输入阻抗(inputimpedance)是指一个电路输入端的等效阻抗。在输入端上加上一个电压源U,测量输入端的电流I,则输入阻抗Rin就是U/I。你可以把输入端想象成一个电阻的两端,这个电

    2022年8月5日
    3
  • UE4 GamePlay架构学习篇[通俗易懂]

    UE4 GamePlay架构学习篇[通俗易懂]附带上激活成功教程版安装说明:1.安装jdk。百度搜索jdk,如果安装了则跳过。2.解压下载的.zip文件。双击打开。syntevo_keygen.jar文件。

    2022年10月4日
    3
  • 我的世界区块显示_我的世界怎么显示区块线

    我的世界区块显示_我的世界怎么显示区块线我的世界手游区块是一个独特的机制,很多玩家对于区块是什么不太了解,区块显示指令以及区块的产生不是很熟悉,为了帮助到大家,今天小编就为大家带来我的世界手游区块显示指令分享:区块玩法操作详解的内容,希望大家能够喜欢,下面就让我们一起来看看吧!区块相关1.出生点区块在出生点附近的区块是一块围绕世界出生点的区域中的一个区块,只要有玩家在主世界,它就不会被从内存中卸载。这意味着像红石元件和刷怪会继续,甚至所…

    2025年12月11日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号