[bzoj1925][Sdoi2010]地精部落

Posted orzzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[bzoj1925][Sdoi2010]地精部落相关的知识,希望对你有一定的参考价值。

大佬们好神啊,考试都切掉了这题,,本来以为T3可做写完发现不对结果T2还崩了。qwq好闹心啊。。。

找到了一个不玄乎的题解至少转移我看懂了。。clj的都太神了我等蒟蒻不能理解qwq

转自 http://www.xuebuyuan.com/1776773.html

题意:求$1$到$n$个所有排列中有多少种满足高低交错。

思路:$f[n][k]$表示n个数,最后一个为$k$且最后两个递增,$g[n][k]$表示$n$个数最后一个数为$k$且最后两个递减。对于$f[n][k]$,若我们将每个数$x$换为$n+1-x$,则就成了$g[n][n+1-k]$,因此有:$f[n][k]=g[n][n+1-k]$。那么可得:

 由于对称性,我们计算出:

那么最后的答案就是$ans*2$。


 

 

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=10005;
ll f[2][N],ans;
int n,p;
int main(){
    cin>>n>>p;
    if(n==1) ans=1;
    if(n==2) ans=2;
    f[0][1]=0;f[0][2]=1;
    for(int i=3;i<=n;i++){
        int k=i&1;
        for(int j=1;j<=i;j++){
            f[k][j]=f[k^1][i-j+1]+f[k][j-1];
            f[k][j]%=p;
        }
    } 
    for(int i=1;i<=n;i++)
    ans=(ans+f[n&1][i])%p;
    cout<<(ans*2)%p;
}
View Code(代码我的)

以上是关于[bzoj1925][Sdoi2010]地精部落的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 1925: [Sdoi2010]地精部落

bzoj 1925 [Sdoi2010]地精部落 dp

[bzoj1925][Sdoi2010]地精部落_递推_动态规划

BZOJ1925[Sdoi2010]地精部落 组合数+DP

bzoj1925地精部落[SDOI2010](dp)

bzoj1925 [Sdoi2010]地精部落