/*
从第1块地砖走到第i + 1块地砖所需消耗的最小体力值记为dp[i],dp[0] = a[0],dp[1] = a[0] + a[1],i >= 2时,dp[i] = min{dp[i - 1],dp[i - 2]} + a[i],如此可得dp[n - 1];
但是可以优化一下,只用两个变量pre和cur滚动记录dp[i - 1]和dp[i - 2]的值,这样可以降低空间复杂度
*/
#include <stdio.h>
#include <stdlib.h>
int main() {
//读取数据
int n;
scanf("%d\n", &n);
int *a = (int *)malloc(sizeof(int) * n);
if(a == NULL){
printf("Failed Malloc!\n");
return -1;
}
for(int i = 0; i < n; i++){
scanf("%d", a + i);
}
//分情况,如果n为1或2,直接打印结果
if(n == 1){
printf("%d\n", a[0]);
}
else if(n == 2){
printf("%d\n", a[0] + a[1]);
}
else{//其余情况,用pre和cur滚动记录dp[i - 1]和dp[i - 2]的值,最终cur存储dp[n - 1]的值
int pre = a[0];
int cur = a[0] + a[1];
for(int i = 2; i < n; i++){
int next = (pre < cur ? pre : cur) + a[i];
pre = cur;
cur = next;
}
printf("%d\n", cur);
}
//释放空间
free(a);
return 0;
}