P2800 又上锁妖塔

P2800 又上锁妖塔

 【温馨提示】使用仙术时飞过一层塔不花费时间,若爬过去,该层有多高,就要花费多长时间
 
  我们可以用 f [ i ] 表示到达第 i 层时所用最短时间
  到达第 i 层可以有两类方法:
  爬过去:f [ i - 1 ] + a [ i ] 
  飞过去:f [ i - 2 ] + a [ i - 1 ] (跨越一层)
                 f [ i - 3 ] + a [ i - 2 ] (跨越两层)
所以转移方程:f [ i ] = min ( f [ i - 1 ] + a [ i ] , min ( f [ i - 2 ] + a [ i - 1 ] , f [ i - 3 ] + a [ i - 2 ] ) )
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,a[1000001],f[1000001];
int main()
{
    cin>>n;
    
    for(int i=1;i<=n;i++)
      cin>>a[i];
      
    for(int i=1;i<=n;i++)
      f[i]=min(f[i-1]+a[i],min(f[i-2]+a[i-1],f[i-3]+a[i-2]));
    
    cout<<f[n];
    
    return 0;
}

 

 
posted @ 2019-03-27 10:52  晔子  阅读(160)  评论(0编辑  收藏  举报