JEDAN
我们发现,[l,r]相等,修改(l,r)
则一定满足a数组可以达到当且仅当a中相邻两数的差不超过1,感性理解
则建立dp,
dp[i][j] 表示a[i]=j
然后滚动数组一下
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5;
int mod=1e9+7,dp[2][N],a[N],n;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
if((a[1]!=0&&a[1]!=-1)||(a[n]!=0&&a[n]!=-1)){
puts("0");
return 0;
}
dp[0][0]=1;
for(int i=2;i<=n;i++)
{
int k=(i%2+1)%2;
memset(dp[k],0,sizeof(dp[k]));/*一定要记得全赋值为0!!!*/
if(a[i]!=-1){
if(a[i]==0)dp[k][a[i]]=(dp[k^1][a[i]+1]+dp[k^1][a[i]])%mod;
else dp[k][a[i]]=((dp[k^1][a[i]]+dp[k^1][a[i]-1])%mod+dp[k^1][a[i]+1])%mod;
continue;
}
if(a[i]==-1){
dp[k][0]=(dp[k^1][1]+dp[k^1][0])%mod;
for(int j=1;j<=n;j++){
dp[k][j]=((dp[k^1][j-1]+dp[k^1][j])%mod+dp[k^1][j+1])%mod;
}
}
}
printf("%d",dp[(n%2+1)%2][0]);
}