zoukankan      html  css  js  c++  java
  • 【SDOI2010】地精部落

    前几天刷的题一直没写博客qwq
    挑几道比较好的题目写一写吧

    一句话:
    问1~n的全排列中交替排列的个数
    

    交替排列就是序列一升一降交替的排列……
    很显然直接用dp
    设dp[i][j]代表现在是第i个位置,由j转移过来的方案数

    所以很显然有转移方程:

    [dp[i][j]=(dp[i][j-1]+dp[i-1][i-j])%mod ]

    然后直接枚举最后一个位置由哪些数转移过来,统计答案即可

    代码:

    #include<bits/stdc++.h>
    #define ll long long 
    #define N 4505
    using namespace std;
    
    int n,mod;
    int dp[N][N];
    int ans=0;
    
    template<class T>inline void read(T &res)
    {
    	char c;T flag=1;
    	while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
    	while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
    }
    
    int main()
    {
    //	freopen("rabbit.in","r",stdin);
    //	freopen("rabbit.out","w",stdout);
    	read(n);read(mod);
    	if(n==1) {puts("1");return 0;}
    	dp[1][1]=1;
    	for(register int i=2;i<=n;++i)
    		for(register int j=1;j<=i;++j)
    			dp[i][j]=(dp[i][j-1]+dp[i-1][i-j])%mod;
    	for(register int i=1;i<=n;++i) ans=(ans+dp[n-1][i])%mod;
    	printf("%lld
    ",(ans*2)%mod);
    	return 0;
    }
    
  • 相关阅读:
    JavaScript入门二
    JavaScript入门
    CSS样式之补充
    CSS样式之操作属性二
    隔空手势操作
    项目管理培训(2)
    uoot启动过程
    new work
    库函数开发步骤 (转)
    keil(持续更新)
  • 原文地址:https://www.cnblogs.com/tqr06/p/11794779.html
Copyright © 2011-2022 走看看