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,谢谢支持。

posted @ 2021-08-15 11:54  WiccldCute  阅读(63)  评论(0)    收藏  举报