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; }