CF1249E By Elevator or Stairs (dp状态机模型)

最近我发现cf上出现很多状态机模型,然而这种模型是dp中最容易理解也是最有套路的一点

本题能用这种方法做的原因是数值都是大于0的,就不可能存在先走上去再走下来的情况,我刚开始误认为有这种情况导致无法下手

我们显然可以定义f[i][j]表示用j工具到达i层的最小值,因此j有两个选项,如果对于本题一开始没有看出来的,我们可以从数据范围入手

题目的n已经给了10^5范围,而这个n维度是不可能省略的,所以我们想到第二维不可能开很大,自然会想到用状态机表示工具

状态机最重要的初始状态,我们定义f[1][0]=0,f[1][1]=c

因为我们定义的状态是用j工具到达i层,又是从1出发,所以0处不用,而1处需要加上初始等电梯的时间,以便于后期转移

注意本题的ab数组表示的是i到i+1所需的时间,所以我们转移时应该用i-1的数据转移

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
using namespace std;
typedef  long long ll;
const int N=5e5+10;
const int inf=0x3f3f3f3f;
int f[N][2];//到i层以及用j工具需要的最小值
int a[N];
int b[N];
int main(){
    int i;
    int n;
    int c;
    cin>>n>>c;
    for(i=1;i<=n-1;i++){
        scanf("%d",&a[i]);
    }
    for(i=1;i<=n-1;i++){
        scanf("%d",&b[i]);
    }
    memset(f,0,sizeof f);
    f[1][0]=0;
    f[1][1]=c;
    cout<<0<<" ";
    for(i=2;i<=n;i++){
        f[i][0]=min(f[i-1][0]+a[i-1],f[i-1][1]+a[i-1]);
        f[i][1]=min(f[i-1][0]+b[i-1]+c,f[i-1][1]+b[i-1]);
        cout<<min(f[i][0],f[i][1])<<" ";
    }
    cout<<endl;

    return 0;
}

原文地址:https://www.cnblogs.com/ctyakwf/p/12286469.html

时间: 2024-07-28 15:33:49

CF1249E By Elevator or Stairs (dp状态机模型)的相关文章

使用C++实现一套简单的状态机模型——实例

一般来说,"状态机"是一种表达状态转换变换逻辑的方法.曾经有人和我讨论过为什么不直接用ifelse,而要使用"状态机"去实现一些逻辑,认为使用"状态机"是一种炫技的表现.然而对于大型复杂逻辑的变化和跳转,使用ifelse将带来代码难以阅读等弊端.其实ifelse也是一种状态机实现的方式. 之前我们有个业务和操作系统有着强烈的关联,而我们希望比较清晰地描述整个业务中各个子业务的过程,就引入了状态机描述的方式.可是当时的状态机是使用if else方法

使用C++实现一套简单的状态机模型——原理解析

在上一文中,我们介绍了该状态机模型的使用方法.通过例子,我们发现可以使用该模型快速构建满足基本业务需求的状态机.本文我们将解析该模型的基础代码,以便大家可以根据自己状态机特点进行修改.(转载请指明出于breaksoftware的csdn博客) 该模板库的基础方法实现在之后给出的工程的AutoStateChart.h中,该文件一共215行,其中有16行是辅助调试代码.以上一文中状态机类为例: class CMachine_Download_Run_App : public AutoStateCha

dp表模型-如何写出for循环动态规划

题目很肤浅.. 但是这件事我们要做.. 那么有一种方法叫做刷表法.. 当你发现这个问题具有最优子结构,重叠子问题时 那么这是一个dp问题是使用本方法的前提 画出该dp状态所对应的矩阵 画出转移关系线...找出前置依赖的所有状态 如果我们能找到该表的一个遍历顺序可以使得 每次计算都依赖之前已经计算好的结果计算出来 那么我们就能正确地写出这个dp的递推写法 举个例子..矩阵链乘法是按dp表对角线转移 而最长公共子序列就正常m*n地for转移 ============= 这是解决dp问题的一个典型的d

NYOJ16|嵌套矩形|DP|DAG模型|记忆化搜索

矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中.你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内. 输入 第一行是一个正正数N(0<N<10),表示测试数据组数,每组测

[题解]Mail.Ru Cup 2018 Round 1 - A. Elevator or Stairs?

[题目] A. Elevator or Stairs? [描述] Masha要从第x层楼去第y层楼找Egor,可以选择爬楼梯或者坐直升电梯.已知爬楼梯每层需要时间t1:坐直升电梯每层需要时间t2,直升电梯开门或者关门一次需要时间t3,当前直升电梯在第z层楼,直升电梯门是在关闭状态的.如果爬楼梯总时间严格小于坐直升电梯,则选择爬楼梯并输出YES,否则选择坐直升电梯并输出NO. 数据范围:1<=x,y,z,t1,t2,t3<=1000 [思路] 爬楼梯总时长:t1*abs(x-y) 坐直升电梯总时

区间DP经典模型

http://blog.csdn.net/y990041769/article/details/24238547 先附上一个链接 后面有引用的代码 概述 区间 DP:是指在一段区间上进行的一系列动态规划. 对于区间 DP 这一类问题,我们需要计算区间 [1,n] 的答案,通常用一个二维数组 dp 表示,其中 dp[x][y] 表示区间 [x,y]. 有些题目,dp[l][r] 由 dp[l][r-1] 与 dp[l+1][r] 推得; 也有些题目,我们需要枚举区间 [l,r]内的中间点,由两个子

UVA 12486 Space Elevator(数位DP)

题目pdf:http://acm.bnu.edu.cn/v3/external/124/12486.pdf 大致题意:求第n个不包含"4"和"13"为子串的数是多少 , n<= 1e18 思路:就是一般的数位DP,二分答案,对答案的数求数位DP算出此数以内有多少个满足条件的数 但是....居然答案爆long long,要用unsigned long long 才能过,就这个坑点 // 0 ms 0 KB 2633 B 2015-08-15 01:02:36 /

dp常见模型

1.背包问题.0/1背包.完全背包.多重背包.分组背包.依赖背包. 2.子序列.最长非上升/下降子序列.最长先上升再下降子序列.最长公共子序列.最大连续子区间和. 3.最大子矩阵. 4.区间dp. 5.环形dp. 6.树形dp. 7.线段覆盖(http://www.cnblogs.com/bytebull/p/5733956.html.noip2010 引水入城.codevs1214 .codevs3027)

POJ 3280 Cheapest Palindrome ( 区间DP &amp;&amp; 经典模型 )

题意 : 给出一个由 n 中字母组成的长度为 m 的串,给出 n 种字母添加和删除花费的代价,求让给出的串变成回文串的代价. 分析 :  原始模型 ==> 题意和本题差不多,有添和删但是并无代价之分,要求最少操作几次才能是其变成回文串 ① 其实细想之后就会发现如果没有代价之分的话删除和增添其实是一样的,那么除了原串原本拥有的最长回文串不用进行考虑处理,其他都需要进行删除或者增添来使得原串变成回文串,所以只要对原串 S 和其反向串 S' 找出两者的最长公共子串长度 L 再用总长减去 L 即可 ②