P2800

P2800 又上锁妖塔

考虑 dp

dp[i] 表示到达第 i 层最少使用的时间。

通过样例可知,是在第 0 层在往上跳的,最终跳到 n + 1 层的位置。。

那么 dp[i - 3] 表示在 i - 3 层位置使用了仙术跳到第 i - 1 层,再爬一层的楼.

dp[i - 2] 表示在 i - 2 层位置使用了仙术跳到第 i - 1 层,再爬一层的楼.

dp[i - 1] i - 1 是不会使用仙术的,因为若使用了仙术会跳到 i + 1i + 2 层。不用仙术,那么 i 层就可以使用仙术,不用仙术的话就只能爬楼了.

int dp[N];
int a[N];
int main()
{
    int n;
    cin >> n;
    rep(i, n) cin >> a[i];
    if (n == 1 || n == 2)
    {
        cout << 0 << endl;
        return 0;
    }
    memset(dp, 0x3f, sizeof dp);
    dp[0] = 0;
    for (int i = 1; i <= n + 1; i++)
    {
        if (i >= 3)
            dp[i] = min(dp[i], dp[i - 3] + a[i]);
        if (i >= 2)
            dp[i] = min(dp[i], dp[i - 2] + a[i]);
        if (i >= 1)
            dp[i] = min(dp[i], dp[i - 1] + a[i]);
    }
    cout << dp[n + 1] << endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/strategist-614/p/12617039.html