P2800 又上锁妖塔
考虑 dp
dp[i]
表示到达第 i
层最少使用的时间。
通过样例可知,是在第 0
层在往上跳的,最终跳到 n + 1
层的位置。。
那么 dp[i - 3]
表示在 i - 3
层位置使用了仙术跳到第 i - 1
层,再爬一层的楼.
dp[i - 2]
表示在 i - 2
层位置使用了仙术跳到第 i - 1
层,再爬一层的楼.
dp[i - 1]
i - 1
是不会使用仙术的,因为若使用了仙术会跳到 i + 1
或 i + 2
层。不用仙术,那么 i
层就可以使用仙术,不用仙术的话就只能爬楼了.
int dp[N];
int a[N];
int main()
{
int n;
cin >> n;
rep(i, n) cin >> a[i];
if (n == 1 || n == 2)
{
cout << 0 << endl;
return 0;
}
memset(dp, 0x3f, sizeof dp);
dp[0] = 0;
for (int i = 1; i <= n + 1; i++)
{
if (i >= 3)
dp[i] = min(dp[i], dp[i - 3] + a[i]);
if (i >= 2)
dp[i] = min(dp[i], dp[i - 2] + a[i]);
if (i >= 1)
dp[i] = min(dp[i], dp[i - 1] + a[i]);
}
cout << dp[n + 1] << endl;
return 0;
}