首页 > 其他 > 详细

[DP]luogu P2467 地精部落

时间:2019-08-17 09:39:56      阅读:86      评论:0      收藏:0      [点我收藏+]

https://www.luogu.org/problem/P2467

分析

我们需要搞到一些奇特的性质(都是在合法序列情况下的):

性质1:当i和i+1不相邻时,交换i和i+1是一种可行的方案

性质2:给每个数都变换为n-ai+1,是一种可行方案,且山峰和山谷情况会反过来

性质3:一个合法的序列,完全翻转过来也是一个合法的序列

那么有f[i][j]表示用1~i的数字,以j作为第一个山峰

那么有方程:f[i][j]=f[i][j-1]+f[i-1][i-j+1]

各满足性质1和2,可以画图思考

最后方案数统计完之后乘二,对应性质3

 

技术分享图片
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int N=4.2e3+10;
int n;
ll p,f[2][N],ans;

int main() {
    scanf("%d%lld",&n,&p);
    f[0][2]=1;
    for (int i=3,q=1;i<=n;i++,q^=1)
        for (int j=2;j<=i;j++)
            f[q][j]=(f[q][j-1]+f[q^1][i-j+1])%p;
    for (int i=2;i<=n;i++) ans=(ans+f[n&1][i])%p;
    printf("%lld",ans*2%p);
}
View Code

 

[DP]luogu P2467 地精部落

原文:https://www.cnblogs.com/mastervan/p/11367337.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!