P2800 又上锁妖塔
P2800 又上锁妖塔
三种方式,当前这一层,是爬上来的,由上一层跳上来,由上二层跳上来。
取min
#include<iostream> #include<cstdio> #include<queue> #include<algorithm> #include<cmath> #include<ctime> #include<cstring> #define inf 2147483647 #define For(i,a,b) for(register int i=a;i<=b;i++) #define p(a) putchar(a) #define g() getchar() //by war //2017.10.16 using namespace std; int n; int Min=inf; int h[1000010]; int f[1000010][3]; void in(int &x) { int y=1; char c=g();x=0; while(c<'0'||c>'9') { if(c=='-') y=-1; c=g(); } while(c<='9'&&c>='0')x=x*10+c-'0',c=g(); x*=y; } void o(int x) { if(x<0) { p('-'); x=-x; } if(x>9)o(x/10); p(x%10+'0'); } int main() { in(n); For(i,1,n) in(h[i]); For(i,1,n) For(j,0,2) f[i][j]=inf; f[1][0]=h[1]; f[1][1]=0; f[1][2]=0; For(i,2,n) { For(j,0,2) f[i][0]=min(f[i][0],f[i-1][j]+h[i]); f[i][2]=min(f[i][2],f[i-2][0]); f[i][1]=min(f[i][1],f[i-1][0]); } For(i,0,2) Min=min(Min,f[n][i]); o(Min); /* For(i,1,n) { For(j,0,2) o(f[i][j]),p(' '); p('\n'); } */ return 0; }