zoukankan      html  css  js  c++  java
  • 第十届蓝桥杯国赛C++B组 排列数

    排列数

    在一个排列中,一个折点是指排列中的一个元素,它同时小于两边的元素,或者同时大于两边的元素。

    对于一个 1∼n 的排列,如果可以将这个排列中包含 t 个折点,则它称为一个 t+1 单调序列。

    例如,排列 (1,4,2,3) 是一个 3 单调序列,其中 4 和 2 都是折点。

    给定 n 和 k,请问 1∼n 的所有排列中有多少个 k 单调队列?

    输入格式

    输入一行包含两个整数 n,k。

    输出格式

    输出一个整数,表示答案。

    答案可能很大,你可需要输出满足条件的排列数量除以 123456 的余数即可。

    数据范围

    1≤k≤n≤500

    输入样例:

    4  2
    

    输出样例:

     12




    思路参考自抽风巨巨的证明---> 链接
    import java.util.Scanner;
    
    public class Main{
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            int k = sc.nextInt();
            int mod = 123456;
            int[][] dp = new int[550][550];
            dp[1][1] = 1;
            dp[2][1] = 2;
            for(int i=3;i<=n;i++) for(int j=1;j<=k&&j<=i;j++)
                if(j>=2) dp[i][j] = (dp[i-1][j] *j%mod +dp[i-1][j-1]*2%mod+dp[i-1][j-2]*(i-j)%mod)%mod;
                else dp[i][j] = (dp[i-1][j] *j%mod +dp[i-1][j-1]*2%mod)%mod;
            System.out.println(dp[n][k]);
        }
    }

       

  • 相关阅读:
    2018-9-4-Roslyn-通过-nuget-统一管理信息
    2018-9-4-Roslyn-通过-nuget-统一管理信息
    省赛前最后一次总结
    省赛前最后一次总结
    POJ 1845-Sumdiv(厉害了这个题)
    POJ 1845-Sumdiv(厉害了这个题)
    DP背包(一)
    DP背包(一)
    训练记录
    训练记录
  • 原文地址:https://www.cnblogs.com/fxzemmm/p/14315661.html
Copyright © 2011-2022 走看看