1 solutions
-
0
C++ :
#define MAXN 1010UL #define MAXB 100UL #define B(a) (a+1) #include <cstdio> #include <cstring> inline int MAX(int a,int b){ return a>b?a:b; } struct BigNum{ int s[MAXB]; inline void clr(){memset(s,0,sizeof(s));return;} inline void prx(){printf("%d",s[s[0]]);for(int i=s[0]-1;i>0;i--) printf("%08d",s[i]);return;} inline void setnum(int p){while(p) s[++s[0]]=p%10,p/=10;return;} friend BigNum operator + (BigNum temp_a,BigNum temp_b){ if(!temp_a.s[0]) return temp_b; if(!temp_b.s[0]) return temp_a; BigNum temp_c;temp_c.clr(); int i,j,*a=temp_a.s,*b=temp_b.s,*c=temp_c.s; c[0]=MAX(a[0],b[0])+1; for(i=1;i<c[0];i++){ c[i]+=a[i]+b[i]; if(c[i]>99999999) c[i]-=100000000,++c[i+1]; } while(!c[c[0]]&&c[0]>1) --c[0]; return temp_c; } }; BigNum f[MAXN][MAXN]; int n,s[MAXN],p[MAXN]; bool ex[MAXN<<1]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&s[i]),ex[s[i]]=true; for(int i=1;i<=n;i++) scanf("%d",&p[i]),ex[p[i]]=true; f[B(0)][B(0)].setnum(1); for(int i=1;i<=n;i++){ for(int j=0;j<=n;j++){ //h-1 i+1 num=i+j 0<=j<=i-1 if(i-1>=j) if((ex[i+j]&&s[i]==i+j)||((!ex[i+j])&&(!s[i]))) f[B(i)][B(j)]=f[B(i)][B(j)]+f[B(i-1)][B(j)]; //h-2 j+1 num=i+j j<=i<=n if(i>=j) if((ex[i+j]&&p[j]==i+j)||((!ex[i+j])&&(!p[j]))) f[B(i)][B(j)]=f[B(i)][B(j)]+f[B(i)][B(j-1)]; //printf("%d %d->\n",i,j); //f[B(i)][B(j)].prx(); } } f[B(n)][B(n)].prx(); return 0; }
- 1
Information
- ID
- 18565
- Time
- 1000ms
- Memory
- 512MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By