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)
上一篇 2022年1月30日 下午9:00
下一篇 2022年1月30日 下午9:00


相关推荐

  • 豆包AI合成背景怎样口令

    豆包AI合成背景怎样口令

    2026年3月12日
    2
  • android是什么意思

    android是什么意思Android 一词最早出现于法国作家利尔亚当 AugusteVilli Isle Adam 在 1886 年发表的科幻小说 未来夏娃 L vefuture 中 他将外表像人的机器起名为 Android Android 一词的本义指 机器人 同时也是 Google 于 2007 年 11 月 5 日宣布的基于 Linux 平台的开源手机操作系统的名称 该平台由操作系统 中间件 用户界面和应用软件组

    2026年3月17日
    2
  • 基于Android点餐系统的设计与实现

    基于Android点餐系统的设计与实现该APP是一个包含前端用户点餐App和后端餐厅管理网页的系统,主要实现菜品相关的修改和展示、个人信息的管理、点餐预约等。

    2022年6月19日
    28
  • python开发环境搭建、pycharm安装matplotlib、numpy等包方法

    python开发环境搭建、pycharm安装matplotlib、numpy等包方法之前电脑上已经安装 pycharm 编辑器 这是个很强大的 python 开发编辑工具 除了写代码外 集成了环境切换 安装各类应用包 项目建设等功能 一 pycharm 中 run pythonconsol 和 terminal 区别 run 窗口是平时编辑代码运行后的输入输出台 提供用户输入 运行结果显示 报出异常等功能 pythonconsol 是 python 交互式编辑运行窗口 用户通过编辑每行代码 自动输出结果 如果含 print 语句的话 对于现阶段的我来说应该没有什么用 term

    2026年3月27日
    3
  • 稳压二极管的使用

    稳压二极管的使用1N4727DataSh 稳压二极管的主要参数 1 2 nbsp nbsp nbsp nbsp 1 Vz nbsp 稳定电压 nbsp nbsp nbsp nbsp 指稳压管通过额定电流时两端产生的稳定电压值 该值随工作电流和温度的不同而略有改变 由于制造工艺的差别 同一型号稳压管的稳压值也不完全一致 从上面的 datasheet 可以知道 1N4727 的 Vz 3V 1n4728 的 Vz 3 3V nbsp nbsp nbsp nbsp 2 IzT

    2026年3月18日
    1
  • leetcode-155最小栈(历史最值)「建议收藏」

    leetcode-155最小栈(历史最值)「建议收藏」原题链接设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:输入:[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”][[],[-2],[0],[-3],[],[],[],[]]输出:[null,null,null,nul

    2022年8月8日
    6

发表回复

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

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