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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • erp学习交流社区

    erp学习交流社区[size=x-large]Hi,我是李彬,在ERP100俱乐部上建立了个人主页,邀请你也加入并成为我的好友。请加入到我的好友中,你就可以通过我的个人主页了解我的近况,分享我的照片,随时与我保持联系。邀请附言:请你点击以下链接,接受好友邀请:http://hi.erp100.com/invite.php?u=185659&c=9340c471d7847b99…

    2022年10月21日
    3
  • JavaScript – 正则表达式

    JavaScript – 正则表达式

    2022年3月13日
    102
  • cb使用msagent

    cb使用msagent—-1、添加agent控件—-选择菜单component,importactivexcontrol——在importactivex下的列表框中选择microsoftagentcontrol2.0(version2.0),点击按钮install——在install对话框中点击按钮ok——在confirm对话框中点击按钮yes——在对话框中点击按钮ok。至此,agent控件

    2022年6月16日
    32
  • 2021navicat激活码【2021免费激活】

    (2021navicat激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月26日
    51
  • python基础(5)字典「建议收藏」

    python基础(5)字典「建议收藏」字典字典的key和value一一对应的,字典是可变的,也是有序的(python3.6版本开始字典有序),可迭代的增加元素当key不存在时,直接赋值a={"status"

    2022年7月28日
    4
  • 激光三角测距原理概述

    激光三角测距原理概述激光三角测距法作为低成本的激光雷达设计方案,可获得高精度、高性价比的应用效果,并成为室内服务机器人导航的首选方案,本文将对激光雷达核心组件进行介绍并重点阐述基于激光三角测距法的激光雷达原理。激光雷达四大核心组件激光雷达主要由激光器、接收器、信号处理单元和旋转机构这四大核心组件构成。激光器:激光器是激光雷达中的激光发射机构。在工作过程中,它会以脉冲的方式点亮。以思岚科技的RPLID…

    2022年5月5日
    53

发表回复

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

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