首页 > 其他 > 详细

【BZOJ1925】【Sdoi2010】地精部落 动规 不知语,人已醉。 Euler Zigzag Number

时间:2015-03-25 09:01:58      阅读:404      评论:0      收藏:0      [点我收藏+]

链接:

#include <stdio.h>
int main()
{
    puts("转载请注明出处[vmurder]谢谢,哎呀这篇我写得真的很费劲的~");
    puts("网址:blog.csdn.net/vmurder/article/details/44604275");
}

不会啊。Euler Zigzag Number好神啊~
但是我可以给你丽洁爷的链接
http://hi.baidu.com/wjbzbmr/item/da020be63f6f41f92b09a410

fi,j=fi,j?1+fi?1,i?j
丽洁原话:【是1到n的排列中第一个是k且一开始下降的数量】
就是说fi,j表示有一个序列,里面的数是1...n(当然,如果并不是这种形式,那么你可以在脑海中离散化一下,然后就变成1~n啦!),然后第一个数是j,并且第一个是山峰,然后这样f就可以表示为(理解成,认为是)在上述情况下的方案数。
真是难为我这个蒟蒻了。
当然,这个原话……
(不,写到这里我觉悟了,他说的是错的啊……)

fi,j表示有个大小为i的数集{1...i},然后开头可以是1j中的任何一个,但是需要是山峰。然后f表示方案数。

然后转移方程fi,j?1部分就是开头为1~j?1先算出来了,方案数加进来。
f_{i-1,i-j}则是开头选了j,剩下i?1个数,离散化一下是一个大小为i?1的数集,然后开头必须选1~j?1来保证下降。但是f表示上升,所以取反,然后应该等于fi?1,i?j

……
另外注意,这题卡内存,64MB,需要滚动数组。

代码:

代码一分钟,题解俩小时。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 5010
using namespace std;
int n,p;
int f[2][N];
int now,last;
int main()
{
    int i,j;
    scanf("%d%d",&n,&p);
    f[1][1]=1;
    now=1,last=0;
    for(i=2;i<=n;i++)
    {
        now^=1,last^=1;
        for(j=1;j<=n;j++)
            f[now][j]=(f[now][j-1]+f[last][i-j])%p;
    }
    if(n==1)puts("1");
    else printf("%d\n",(f[now][n]<<1)%p);

    return 0;
}

【BZOJ1925】【Sdoi2010】地精部落 动规 不知语,人已醉。 Euler Zigzag Number

原文:http://blog.csdn.net/vmurder/article/details/44604275

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