A题 经典的线性dp
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
const long long mod=1e9+7;
signed main()
{
int N;
cin>>N;
int M;
cin>>M;
int a[N];
vector <int> oks(N+1,1);
for(int i=0;i<M;i++)
{
cin>>a[i];
oks[a[i]]=0;
}
vector<long long int>dp(N+1,0);
dp[0]=1;
if(oks[1]) dp[1]=1;
for(int x=2;x<=N;x++)
{
if(oks[x]&&oks[x-1])
dp[x]+=dp[x-1];
if(oks[x-2])
dp[x]=(dp[x]+dp[x-2])%mod;
}
cout<<dp[N]<<endl;
return 0;
第一种方法降低时间复杂度就能够过,线性dp,最关键的还是要按照正常逻辑写就行。之后的题目还在艰难补题中,没找到题目,题目已经寄了,后面的帖子会逐渐补这些题目。