AcWing 5400. 蜗牛 状态dp

这篇文章介绍了一个使用C++编写的动态规划算法来解决竹竿爬升问题,通过计算在不同条件下到达目标所需的最短时间,最终输出最小成本。
摘要由CSDN通过智能技术生成

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

const int N = 1e5 + 10, INF = 2e9;

int x[N], a[N], b[N];
// a数组是传送前的数组,b数组是传送后的数组
int n;
double f[N][2];

double get(double x, double y) // 竖直位置上从x到y所需的时间
{
    if(x > y) return (x - y) / 1.3; // 向下
    else return (y - x) / 0.7; // 向上
}

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i ++) cin >> x[i];
    for(int i = 1; i < n; i ++) cin >> a[i] >> b[i + 1];

    for(int i = 1; i <= n; i ++) f[i][0] = f[i][1] = INF;//求最小值,全部初始化正无穷

    f[1][0] = x[1]; //第一根竹杆只可以从地面上爬过来

    for(int i = 2; i <= n; i ++)
    {
        int d = x[i] - x[i - 1];

        //dp
        f[i][0] = min(
                f[i - 1][0] + d,
                f[i - 1][1] + d + get(b[i - 1], 0)
        );

        f[i][1] = min(
                f[i - 1][0] + get(0, a[i - 1]),
                f[i - 1][1] + get(b[i - 1], a[i - 1])
        );
    }

    printf("%.2lf\n", min(f[n][0], f[n][1] + b[n] / 1.3));
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值