首页 > 试题广场 >

排列计数

[编程题]排列计数
  • 热度指数:217 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

给定一个大小为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取模后的结果。

示例1

输入

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();
    }
}

发表于 2020-02-27 21:44:20 回复(3)
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()


发表于 2020-04-15 21:24:13 回复(3)