#include<bits/stdc++.h>
#define N 602
using namespace std;
typedef long long ll;
int n,now,a[N],sm;
int tag[N];
ll jie[N],dp[2][302][302];
const int mod=1e9+7;
inline void MOD(ll &x){x=x>=mod?x-mod:x;}
inline ll rd(){
    ll x=0;char c=getchar();bool f=0;
    while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
    while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
    return f?-x:x;
}
int main(){
    n=rd();
    sm=n*2;
    int cnt=0;
    for(int i=1;i<=sm;++i){
        a[i]=rd();
        if(a[i]!=-1)tag[a[i]]=1;
        if(i%2==0&&a[i]!=-1&&a[i-1]!=-1){
            tag[a[i]]=-1;
            tag[a[i-1]]=-1;
        }
        if(i%2==0&&a[i]==-1&&a[i-1]==-1)cnt++;
    }
    jie[0]=1;
    for(int i=1;i<=sm;++i)jie[i]=jie[i-1]*i%mod;
    dp[1][0][0]=1;
    int now=1,pre=0;
    for(int i=sm;i>=1;--i)if(tag[i]!=-1){
        swap(now,pre);
        memset(dp[now],0,sizeof(dp[now]));
        for(int j=0;j<=n;++j)
            for(int k=0;j+k<=n;++k)if(dp[pre][j][k]){
                if(tag[i]){
                  MOD(dp[now][j][k+1]+=dp[pre][j][k]);
                  if(j)MOD(dp[now][j-1][k]+=dp[pre][j][k]);
                }
                else{
                  MOD(dp[now][j+1][k]+=dp[pre][j][k]);
                  if(j)MOD(dp[now][j-1][k]+=dp[pre][j][k]);
                  if(k)MOD(dp[now][j][k-1]+=dp[pre][j][k]*k%mod);
                }
            }
    }
    printf("%lld",dp[now][0][0]*jie[cnt]%mod);
    return 0;
}