给定一个大小为N-1且只包含0和1的序列A1到AN-1,如果一个1到N的排列P1到PN满足对于1≤i<N,当Ai=0时Pi<Pi+1,当Ai=1时Pi>Pi+1,则称该排列符合要求,那么有多少个符合要求的排列?
给定一个大小为N-1且只包含0和1的序列A1到AN-1,如果一个1到N的排列P1到PN满足对于1≤i<N,当Ai=0时Pi<Pi+1,当Ai=1时Pi>Pi+1,则称该排列符合要求,那么有多少个符合要求的排列?
第一行包含一个整数N,1<N≤1000。
第二行包含N-1个空格隔开的整数A1到AN-1,0≤Ai≤1。
输出符合要求的排列个数对109+7取模后的结果。
4 1 1 0
3
符合要求的排列为{3 2 1 4}、{4 2 1 3}和{4 3 1 2}。
import java.util.*;
public class Main {
public static void main(String[] args) {
int md=10000007;
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
int[] m=new int[n];
int[][] dp=new int[n+1][n+1];
for(int i = 0; i < n-1; i++){
m[i]=sc.nextInt();
}
for(int i=0;i<n;i++){
dp[0][i]=1;
}
for(int i = 1; i < n;i++){
if(m[i-1]==1){
for(int j =n-i-1;j>=0;j--){
dp[i][j]+=(dp[i-1][j+1]+dp[i][j+1])%md;
dp[i][j]%=md;
}
}
else{
dp[i][0]+=dp[i-1][0];
for(int j=1;j<n-i;j++){
dp[i][j]+=(dp[i-1][j]+dp[i][j-1])%md;
dp[i][j]%=md;
}
}
}
System.out.println(dp[n-1][0]);
sc.close();
}
} def main(): mod = 1000000007 N = int(input()) flags = list(map(int, input().strip().split())) dp = [[0 for _ in range(N+1)] for _ in range(N)] for i in range(N): dp[0][i] = 1 for i in range(1, N): if flags[i-1] == 1: for j in range(N-i-1, -1, -1): dp[i][j] += dp[i-1][j+1] + dp[i][j+1] dp[i][j] %= mod else: dp[i][0] += dp[i-1][0] dp[i][0] %= mod for j in range(1, N-i): dp[i][j] += dp[i-1][j] + dp[i][j-1] dp[i][j] %= mod # print(dp) print(dp[N-1][0] % mod) if __name__ == '__main__': main()