原题链接:传送门
思路:
思路:动态规划,我们拿样例来分析,t()跳上来的not()走上的
到达第五层的最短时间:min(t(4),t(3))
min(t(4)+a[i],nt(4)+a[i])
分析:1:跳到五层我们可以是从第四层跳上来的,也可以是从第三层跳上来的
2:走到第五层我们只能是从第四层走上来的,这里分两种情况:之前跳到第四层,我们在走到第五层。之前走到第四层,再走到第五层。
分析完问题,转移方程就出来了:到达第n层的最短时间:
min(t(n-1),t(n-2))
min(t(n-1),nt(n-1))+a[i]
确定边界:t[1]=0(到达第一层可以是跳的)
t[2]=0(到达第二层也可以是跳的)
nt[1]=a[1](走到第一层)
到这里,问题已经得到了解决,我们再进行优化,dp[i][0]是跳的dp[i][1]是走的
那么到达第n层的最短时间(以下取最小值)
Min(dp[n-1][0],dp[n-2][0])
Min(dp[n-1][0],dp[n-1][1])+a[i]
code:
#include<iostream>
using namespace std;
const int maxn=10005;
int main()
{
int n,a[maxn],dp[maxn][2];//dp[i][0]跳dp[i][1]走
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
dp[1][0]=0,dp[2][0]=0,dp[1][1]=a[1];//确定边界
for(int i=2;i<=n;i++)
{
dp[i][0]=min(dp[i-1][1],dp[i-2][1]);//从前边跳上来
dp[i][1]=min(dp[i-1][1],dp[i-1][0])+a[i];//从前一层走上来
}
cout<<min(dp[n][0],dp[n][1]);
return 0;
}