zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 95 (Rated for Div. 2)C. Mortal Kombat Tower(DP)

    题意:  给你一个数n,下面紧接着给你n个数,由0到1组成,如果为1则说明此boss较难,0则较简单,你的朋友每通过一个较难的boss时需使用一个跳跃点,你的朋友先手每次能杀死1或2个boss紧接着是你一直到n个boss杀完,问:至少需要多少个跳跃点.

    思路: 两种情况:

    定义两个参数:i 代表 第几个怪物,1代表我击杀怪物,0代表队友击杀怪物。

    然后分两种情况:

    1. 如果当前这个怪物是我杀的,那么  dp[i][1]=min(dp[i1][0],dp[i2][0])dp[i][1]=min(dp[i−1][0],dp[i−2][0])。

    2. 如果当前这个怪物是朋友杀的,那么 dp[i][0]=min(dp[i1][1]+a[i],dp[i2][1]+a[i1]+a[i])。

    最后 dp[i][1] 和 dp[i][0]比较大小就行了。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=2e5+10;
    const double eps=1e-7;
    const ll INF=1e9+10;
    int main()
    {
        int t;
        int n;
        ll a[N];
        ll dp[N][2];
        cin>>t;
        while(t--)
        {
            cin>>n;
            for(int i=1; i<=n; ++i)
            {
                cin>>a[i];
                dp[i][0]=INF;
                dp[i][1]=INF;
            }
            dp[1][0]=a[1];
            dp[2][0]=a[1]+a[2];
            dp[2][1]=a[1];
            for(int i=3; i<=n; ++i)
            {
                dp[i][1]=min(dp[i-1][0],dp[i-2][0]);  //如果该这个怪物是我打
                dp[i][0]=min(dp[i-1][1]+a[i],dp[i-2][1]+a[i-1]+a[i]);//如果这个怪物是对队友打
            }
            printf("%d
    ",min(dp[n][0],dp[n][1]));
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    Frequency of String CodeForces
    Sign on Fence CodeForces
    洛谷 P3332 [ZJOI2013]K大数查询 || bzoj3110
    spoj DYNALCA
    洛谷 P2824 [HEOI2016/TJOI2016]排序 (线段树合并)
    洛谷 P3203 [HNOI2010]弹飞绵羊 || bzoj2002
    bzoj 1036: [ZJOI2008]树的统计Count
    Shiro Authenticator认证器
    Shiro 十分钟教程
    Shiro 架构
  • 原文地址:https://www.cnblogs.com/sszywq/p/13762595.html
Copyright © 2011-2022 走看看