列表

详情


DP4. 最小花费爬楼梯

描述

给定一个整数数组 ,其中 是从楼梯第个台阶向上爬需要支付的费用,下标从0开始。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

数据范围:数组长度满足 ,数组中的值满足

输入描述

第一行输入一个正整数 n ,表示数组 cost 的长度。
第二行输入 n 个正整数,表示数组 cost 的值。

输出描述

输出最低花费

示例1

输入:

3
2 5 20

输出:

5

说明:

你将从下标为1的台阶开始,支付5 ,向上爬两个台阶,到达楼梯顶部。总花费为5

示例2

输入:

10
1 100 1 1 1 90 1 1 80 1

输出:

6

说明:

你将从下标为 0 的台阶开始。 1.支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。 2.支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。 3.支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。 4.支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。 5.支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。 6.支付 1 ,向上爬一个台阶,到达楼梯顶部。 总花费为 6 。

原站题解

C++ 解法, 执行用时: 6ms, 内存消耗: 1168KB, 提交时间: 2022-03-04

#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &f)
{
    f=0;T fu=1;char c=getchar();
    while(c<'0'||c>'9') {if(c=='-'){fu=-1;}c=getchar();}
    while(c>='0'&&c<='9') {f=(f<<3)+(f<<1)+(c&15);c=getchar();}
    f*=fu;
}
template <typename T>
void print(T x)
{
    if(x<0) putchar('-'),x=-x;
    if(x<10) putchar(x+48);
    else print(x/10),putchar(x%10+48);
}
template <typename T>
void print(T x, char t)
{
    print(x);putchar(t);
}
const int maxn=1e5+50;
int n,a[maxn];
int dp[maxn];
void solve()
{
    read(n);
    for(int i=1;i<=n;++i) 
    read(a[i]);
    dp[1]=dp[2]=0;
    for(int i=3;i<=n+1;++i)
    {
        dp[i]=min(dp[i-1]+a[i-1],dp[i-2]+a[i-2]);
    }
    print(dp[n+1]);
}
int main()
{
    #ifdef AC
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
    clock_t program_start_clock=clock();
    solve();
    fprintf(stderr,"\nTotal Time: %lf ms",double(clock()-program_start_clock)/(CLOCKS_PER_SEC/1000));
    return 0;
}

C++ 解法, 执行用时: 6ms, 内存消耗: 1180KB, 提交时间: 2022-05-08

#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T& f) {
    f = 0;
    T fu = 1;
    char c = getchar();
    while (c < '0' || c > '9') {
        if (c == '-') {
            fu = -1;
        }
        c = getchar();
    }
    while (c >= '0' && c <= '9') {
        f = (f << 3) + (f << 1) + (c & 15);
        c = getchar();
    }
    f *= fu;
}
template <typename T>
void print(T x) {
    if (x < 0) putchar('-'), x = -x;
    if (x < 10) putchar(x + 48);
    else print(x / 10), putchar(x % 10 + 48);
}
template <typename T>
void print(T x, char t) {
    print(x);
    putchar(t);
}
const int maxn = 1e5 + 50;
int n, a[maxn];
int dp[maxn];
void solve() {
    read(n);
    for (int i = 1; i <= n; ++i)
        read(a[i]);
    dp[1] = dp[2] = 0;
    for (int i = 3; i <= n + 1; ++i) {
        dp[i] = min(dp[i - 1] + a[i - 1], dp[i - 2] + a[i - 2]);
    }
    print(dp[n + 1]);
}
int main() {
#ifdef AC
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
    clock_t program_start_clock = clock();
    solve();
    fprintf(stderr, "\nTotal Time: %lf ms",
            double(clock() - program_start_clock) / (CLOCKS_PER_SEC / 1000));
    return 0;
}

C 解法, 执行用时: 10ms, 内存消耗: 1076KB, 提交时间: 2022-02-15

#include <stdio.h>
#include <stdlib.h>

int Min(int i,int j){
    return i>j?j:i;
}

int main(){
    int n =0;
    scanf("%d",&n);
    int *dp,*cost;
    dp = (int*)malloc(sizeof(int)*n);
    cost = (int*)malloc(sizeof(int)*n);
    for(int i=0;i<n;i++){
        scanf("%d",cost+i);
        dp[i] =0;
    }
    //初始化
    if(n==1){
        printf("%d",cost[0]);
    }else if(n==2){
        printf("%d",Min(cost[0],cost[1]));
    }else{
        dp[n-1] = cost[n-1];
        dp[n-2] = cost[n-2];
        for(int i =n-3;i>=0;i--){
            dp[i] = cost[i]+Min(dp[i+1],dp[i+2]);
//             min_cost = Min(min_cost, dp[i]);
        }
        printf("%d",Min(dp[0], dp[1]));
    }
    
    return 0;
}

C 解法, 执行用时: 11ms, 内存消耗: 316KB, 提交时间: 2022-03-28

#include <stdio.h>
#include <assert.h>
int main(void)
{
    int n;
    while(scanf("%d", &n) != EOF)
    {
        assert(n>0 && n<=100000);
        if(n < 3){
            int val_0;   scanf("%d", &val_0);   assert(val_0>0 && val_0<=10000);
            if(n < 2){ printf("%d\n", val_0);   continue; }
            int val_1;   scanf("%d", &val_1);   assert(val_1>0 && val_1<=10000);
            printf("%d\n", val_0<val_1 ? val_0 : val_1);   continue;
        }
        
        int val_0, val_1;
        scanf("%d %d", &val_0, &val_1);
        assert(val_0>0 && val_0<=10000);   assert(val_1>0 && val_1<=10000);
        
        int dp_0 = 0, dp_1 = 0;
        for(int i=2,val; i<n; ++i){
            int tmp_0 = dp_0+val_0, tmp_1 = dp_1+val_1;
            dp_0 = dp_1;   dp_1 = tmp_0<tmp_1 ? tmp_0 : tmp_1;
            val_0 = val_1;   scanf("%d", &val_1);   assert(val_1>0 && val_1<=10000);
        }
        int tmp_0 = dp_0+val_0, tmp_1 = dp_1+val_1;
        printf("%d\n", tmp_0<tmp_1 ? tmp_0 : tmp_1);
    }
    return 0;
}

C++ 解法, 执行用时: 11ms, 内存消耗: 1164KB, 提交时间: 2022-03-27

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
int cost[100000],dp[100001];
int main(){
    IOS;
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>cost[i];
    for(int i=2;i<=n;i++)
        dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
    cout<<dp[n];
    return 0;
}

上一题