代码短的惨绝人寰,思维复杂度高的惨绝人寰。

首先很容易抽象出模型,求长度为n的抖动子序列个数,然后我们开始蛋疼。

状态 f[i][j]表示以j开头的长度为i的,并且第一位是下降的抖动子序列个数。显然的是,实际上的答案是个数*2,因为这样并没有算上第一位是上升的。

状态转移方程:

(1)首先我们考虑开头为j-1的抖动子序列个数,显然这样的个数为f[i][j-1];

(2)然后我们考虑开头为j的抖动子序列个数,那么我们就要求第二位x一定要比j小,即x=j-1,但显然这样的序列第一位上升,我们需要把它翻转过来,j-1就变成了(i-1)-(j-1)+1=i-j+1,这样的答案就是f[i-1][i-j+1]。

f[i][j]=f[i][j-1]+f[i-1][i-j+1]

初始化 f[2][2]=1;

蛋疼结束了么?远远没有,答案其实是f[n+1][n+1]*2,因为只有这样才能使第一位放小于n+1的[1,n]。同时必须使用滚动数组,否则MLE;code:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,p,f[2][5001];
int main()
{int ans,i,j,x;scanf("%d%d",&n,&p);f[0][2]=1;for (i=3;i<=n+1;++i){x=i&1;for (j=1;j<=i;++j)f[x][j]=(f[!x][i-j+1]+f[x][j-1])%p;}ans=(f[x][n+1]*2)%p;printf("%d\n",ans);
}

然而我们在很多神犇的博客里看到的题解是这样的(by hzwer学长)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define ll long long
#define inf 1000000000
using namespace std;
inline ll read()
{ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int n,p;
int f[2][4505];
int main()
{n=read();p=read();f[1][1]=1;for(int i=2;i<=n;i++)for(int j=1;j<=n;j++){int x=i&1;f[x][j]=f[x][j-1]+f[x^1][i-j];f[x][j]%=p;}printf("%d",n==1?1%p:f[n&1][n]*2%p);return 0;
}

其实道理也很简单,黄学长把所有的i都向左平移了一位。。。

【BZOJ 1925】【SDOI 2010】地精部落相关推荐

  1. 1925: [Sdoi2010]地精部落

    1925: [Sdoi2010]地精部落 Time Limit: 10 Sec   Memory Limit: 64 MB Submit: 1196   Solved: 730 [ Submit][ ...

  2. [Sdoi2010] 地精部落

    F. 地精部落 题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi ...

  3. bzoj1925【sdoi2010】地精部落

    1925: [Sdoi2010]地精部落 Time Limit: 10 Sec   Memory Limit: 64 MB Submit: 797   Solved: 487 [ Submit][ S ...

  4. [BZOJ 1879][SDOI 2009]Bill的挑战 题解(状压DP)

    [BZOJ 1879][SDOI 2009]Bill的挑战 Description Solution 1.考虑状压的方式. 方案1:如果我们把每一个字符串压起来,用一个布尔数组表示与每一个字母的匹配关 ...

  5. [BZOJ1925]地精部落

    地精部落 题目描述 传说很久以前,大地上居住着一种神秘的生物:地精.地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为N的山脉H可分为从左到右的N段,每段有一个独一无二的高度Hi,其中Hi是1到N之间 ...

  6. P2467 [SDOI2010]地精部落

    P2467 [SDOI2010]地精部落 题意: 有n个山脉高度分别是1到n,现在让你按照山峰山谷的顺序依次摆放(第一个可以是山峰也可以是山谷),问有多少方案(答案mod p) 题解: dp,但是自己 ...

  7. BZOJ1925: [Sdoi2010]地精部落

    BZOJ1925: [Sdoi2010]地精部落 Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中. 具体地说,一座长度为 N 的山脉 H可分 为 ...

  8. DP [Sdoi2010]地精部落

    问题 H: [Sdoi2010]地精部落 时间限制: 1 Sec 内存限制: 64 MB 题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 ...

  9. [luogu2467 SDOI2010] 地精部落

    [luogu2467 SDOI2010] 地精部落 题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为N的山脉H可分为从左到右的N段,每段有 ...

最新文章

  1. 昨天在公司加班,上午好像就是弄一个ftp的linux服务问题
  2. 搞笑向, 面向IE8的webworker-ployfill
  3. 线上日志分析与其他一些脚本
  4. APK反编译得工具总结(转载)
  5. openssl 添加自定义算法_GitHub:用PyTorch实现17种深度强化学习算法
  6. python 颜色_Python可视化|matplotlib07自带颜色条Colormap(三)
  7. 网盘中搭建git服务
  8. 抽象工厂模式_设计模式(3) 抽象工厂模式
  9. PostgreSQL概述
  10. java nio 多路复用_JAVA NIO 一步步构建I/O多路复用的请求模型
  11. python 服务发现_什么是服务发现?
  12. 批量自动下单(京东)
  13. Uniapp进行APP打包——iOS 系统
  14. react做h5 例子_从零搭建 React 开发 H5 模板
  15. java微信支付 openid_微信公众号支付(一)如何获取用户openId
  16. RapidMiner遇到的问题
  17. python--贝壳租房爬虫及数据可视化
  18. win10 wifi图标不见了 修复办法
  19. android手机的根目录,安卓根目录详解
  20. 常见计算机病毒种类及特征介绍与分析

热门文章

  1. cisco 3550
  2. Arduino与Proteus仿真实例-Nokia5110显示屏驱动仿真
  3. 看流行韩剧 简单学韩语
  4. ctcdecode安装报错
  5. 如何在3dmax中添加声音轨道?
  6. 技术横向发展?还是纵向发展?
  7. CAXA三维CAD教程:简单几步设计房屋
  8. 基于SSM实现停车位租赁系统
  9. 如何用代码实现决策树来决策要不要相亲?
  10. GHOSTXPSP3电脑爱好者V9.9装机版