题目:
题目链接:走楼梯2 - 题目 - Daimayuan Online Judgehttp://oj.daimayuan.top/course/11/problem/129
思路:
把大问题转换成小问题
然后逐个解决
设计dp数组
对于dp[i][0]设计为到达第i个台阶,且到达该台阶为从 i-1 台阶走到
对于dp[i][1]设计为到达第i个台阶,且到达该台阶为从 i-2 台阶走到,最近一步走两阶
对于dp[i][2]设计为到达第i个台阶,且到达该台阶为从 i-2 台阶走到,最近两步走两阶
先初始化dp[0][0]=1
然后从第0个台阶开始
一直走到第n个台阶
代码详解:
#include<stdio.h>
#include<iostream>
using namespace std;
long long dp[56][3];
int main()
{
int n;
cin>>n;
dp[0][0]=1;//初始化
for(int i=0;i<=n;i++)//从0台阶开始走
{
for(int j=0;j<=2;j++)//j代表走了j次连续的2
{
if(j<2)//还没连续两次2
{
dp[i+2][j+1]+=dp[i][j];//前一次走了2,这一次继续走2
dp[i+1][0]+=dp[i][j];//前一次走2,这一次走1
}
else//连续了两次2
{
dp[i+1][0]+=dp[i][j];// 走1
}
}
}
cout<<dp[n][0]+dp[n][1]+dp[n][2];//走到n前一步为走1 + 走到n前一步为走2 + 走到n前连续走两次2
return 0;
}
PS:曾经沧海难为水,除却巫山不是云。