AT4787题解
这道题目是一道 动态规划(DP) 的练手题。
思路
我们可以开一个 \(no\) 数组,代表不能走的,然后再开一个 \(dp\) 数组,\(dp_i\) 是走到第 \(i\) 级台阶的总数量。
状态转移方程: \(dp_i=dp_{i-1}+dp_{i-2}\)
注意还是要特判 \(no_i\) 是否等于 \(0\)。
不太理解 DP 的看这里。
Code
int dp[Max],n,m;
bool no[Max];//不能走的。
int main(void){
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){int temp;scanf("%d",&temp);no[temp]=1;}
if(!no[0]) dp[0]=1;
if(!no[1]) dp[1]=1;//注意了,这边要初始化否则会有问题包括 RE。
for(int i=2;i<=n;i++){
if(no[i]==1){dp[i]=0;continue;}//如果不能走就 ByeBye。
else{dp[i]=(dp[i-1]+dp[i-2])%mod;}//如果可以走根据上面的状态转移方程转化,注意要取模。
}
printf("%d\n",dp[n]);//输出,注意是输出 dp[n] 不是 dp[n-1]。
return 0;
}
The end,谢谢支持。

浙公网安备 33010602011771号