问题分析
定义一个二维数组,行表示楼层数,列分别表示不跳跃和跳跃两种情况,j=0表示不跳跃,j=1表示跳跃;
d[i][]表示从第一层到当前层的最短时间
第一层楼:
不跳跃:dp[1][0]=第一层高度
跳跃:dp[1][1]=0
其他楼层:
不跳跃:dp[i][0]=min(上一层不跳的时间,上一层跳的时间)+ 当前层高度=min(dp[i-1][0],dp[i-1][1])
跳跃:dp[i][1]=min((上一层不跳而当前层跳),(当前层与上一层一起跳))=min(dp[i-1][0],dp[i-2][0])
代码描述
import java.util.Scanner;
public class Main{
public static void main(String args[])
{
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int t[]=new int[n];
for (int i=0;i<n;i++)
{
t[i]=in.nextInt();
}
// 定义一个二维数组,行表示楼层数,列分别表示不跳跃和跳跃两种情况
// j=0表示不跳跃,j=1表示跳跃
int dp[][]=new int[n+1][2];
// 第一层楼
dp[0][0]=0;
dp[0][1]=0;
dp[1][0]=t[0];
dp[1][1]=0;
for (int i=2;i<=n;i++)
{
// 这一层不跳,那么就要考虑前一层跳和不跳两种情况
dp[i][0]=Math.min(dp[i-1][0],dp[i-1][1])+t[i-1];
// 其他层
// 这一层跳,要考虑上一层没有跳,或者和上一层一起跳两种情况,因为一次可以跳两层
dp[i][1]=Math.min(dp[i-1][0],dp[i-2][0]);
}
System.out.println(Math.min(dp[n][0],dp[n][1]));
}
}