老鼠跳跃

Tags
动态规划
notion image
这题也算是比较基础的DP了,思路就是将从上往下的过程反过来,定义为当上一步为(奇/偶)步到达i台阶时的走法。这样很容易推出来,同样的奇数步也一样。递推方程简单,主要处理的难点就是要考虑到这个逆推的过程,因为考虑到低于0层也要统计,用下标记录的话显然不合适自顶而下的递推,而自下而上的方式只需要在结束后统计一下n-1到n-1+4的方式即可。
int ratJump(vector<int> &arr) {
	// Write your code here.
	const int mod = 1e9+7;
	int len = arr.size();
	int dp[len+5][2];
	memset(dp,0,sizeof(dp));
	dp[0][0] = 1;
	int odd[3] = {1,2,4};
	int even[3] = {1,3,4};
	for(int i = 0 ; i < len-1 ; i ++){
		for(int j = 0 ; j < 3 ; j ++){
			if(arr[i+odd[j]]==0||i+odd[j]>=len){
				dp[i+odd[j]][1] += dp[i][0];
				dp[i+odd[j]][1]%=mod;
			}
			if(arr[i+even[j]]==0||i+even[j]>=len){
				dp[i+even[j]][0] += dp[i][1];
				dp[i+even[j]][0] %= mod;
			}
		}
	}
	int ans = 0;
	for(int i = len-1 ; i<len+4 ; i ++ ){
		ans = (ans + dp[i][1] +dp[i][0])%mod;
	}
	return ans;
}