zoukankan      html  css  js  c++  java
  • 不可逆转(SDOI2010地精部落)

    提供一个简单一点的思路,不需要滚动数组,也不需要一些奇奇怪怪的性质。

    我们考虑设(f[i])(1)(i)中有多少种波动数列。

    我们可以注意到,波动数列分为先降后升和先升后降两种,但是我们发现其实它们对称,所以只算一个就可以了。

    之后我们令(f[i])表示的先降后升序列种类数,最后输出的时候答案乘以二就可以了。

    我们在计算(f[i])的时候,枚举其中最大数(j)的位置(k)。因为我们先计算的是先降后升序列,所以显然这个位置只能在奇数位上面。

    我们计算的时候就是按上面所说枚举k,然后把(C_{i-1}^{k-1} imes f[i] imes f[i-k])相加求和即可。

    具体看代码:

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int N = 5050;
    int n,mod;
    int f[N];
    long long zuhe[N][N];
    int main()
    {
    	scanf("%d%d",&n,&mod);
    	for(int i=0;i<=n;i++)
    	{
    		zuhe[i][0]=1;
    		for(int j=1;j<=i;j++)
    			zuhe[i][j]=((long long)zuhe[i-1][j-1]+zuhe[i-1][j])%mod;
    	}
    	f[0]=1;
    	for(int i=1;i<=n;i++)
    	{
    		f[i]=0;
    		for(int j=1;j<=i;j+=2)
    			f[i]=(f[i]+((long long)f[j-1]*f[i-j])%mod*zuhe[i-1][j-1]%mod)%mod;
    	}
    	int ans=(f[n]*2)%mod;
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    122. Best Time to Buy and Sell Stock II
    121. Best Time to Buy and Sell Stock
    72. Edit Distance
    583. Delete Operation for Two Strings
    582. Kill Process
    indexDB基本用法
    浏览器的渲染原理
    js实现txt/excel文件下载
    git 常用命令
    nginx进入 配置目录时
  • 原文地址:https://www.cnblogs.com/fengxunling/p/9749462.html
Copyright © 2011-2022 走看看