题解 | #最小花费爬楼梯#dp + 状态压缩

最小花费爬楼梯

https://www.nowcoder.com/practice/9b969a3ec20149e3b870b256ad40844e

#include <iostream>
#include<vector>
#include<sstream>
using namespace std;

int main() {
    int input;
    cin >> input;
    vector<int> stairs;
    string stmp;
    getline(cin.ignore(), stmp);
    stringstream ss(stmp);
    int num;
    while (ss >> num) {
        stairs.push_back(num);
    }
    if (stairs.size() == 1) {
        cout << stairs[0];
    } else if (stairs.size() != 0) {
	   //初始状态为d(0)和d(1)
        int node1_to_now = stairs[0];//d(i-2)到d(i)所需要的最小花费
        int node2_tonow = stairs[1];//d(i-1)到d(i)所需要的最小花费
        int to_now_cost_min;//当前d(i)最小花费返回值
        int before_tonode1 = 0;//从头到d(i-2)的最小花费
        int before_tonode2 = 0;//从头到d(i-1)的最小花费
        int cost;
        for (int i = 2; i < stairs.size(); ++i) {

		  //转移方程:到达d(i)的最小花费为:从头到达d(i-1)的最小花费d(i-1)到达当前节点d(i)的最小化花费 与 从头到达d(i-2)的最小花费d(i-2)到达当前节点d(i)的最小化花费 的最小值:
            to_now_cost_min = min(node1_to_now + before_tonode1,
                                  node2_tonow + before_tonode2);

            //空间压缩,我们只需要当前节点的前两个节点的信息就够了
            node1_to_now = node2_tonow;
            before_tonode1 = before_tonode2;
            node2_tonow = stairs[i];
            before_tonode2 = to_now_cost_min;

        }
        to_now_cost_min = min(node1_to_now + before_tonode1,
                              node2_tonow + before_tonode2);
        cout << to_now_cost_min;
    }

}

// 64 位输出请用 printf("%lld")

全部评论

相关推荐

01-08 12:01
门头沟学院 Java
冰炸橙汁_不做oj版:不接好运
点赞 评论 收藏
分享
迟缓的马里奥求你们别...:我双2,FPGA方向,在成都找工作投了上百家,收到面试的不超过10家,是成都这个地方太有说法了。西南柬埔寨
秋招,不懂就问
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务