传送门

dp好题。


设f[i][j]f[i][j]f[i][j]表示iii个数结尾是jjj且结尾两个数递增的方案数。

那么显然可以对称的定义出g[i][j]g[i][j]g[i][j]表示iii个数结尾是jjj且结尾两个数递减的方案数。

那么显然有f[i][j]=g[i][i−j+1]f[i][j]=g[i][i-j+1]f[i][j]=g[i][i−j+1](考虑把第一个序列中每个数k都变成i-k+1)

且Ans=∑i=1n(f[n][i]+g[n][i])=2∗∑i=1nf[n][i]Ans=\sum _{i=1} ^n(f[n][i]+g[n][i])=2*\sum _{i=1} ^nf[n][i]Ans=∑i=1n​(f[n][i]+g[n][i])=2∗∑i=1n​f[n][i]

由于f[i][j]=∑k=1j−1g[i−1][k]f[i][j]=\sum _{k=1} ^{j-1} g[i-1][k]f[i][j]=∑k=1j−1​g[i−1][k]

=>f[i][j]=∑k=1j−1f[i−1][i−1−k+1]f[i][j]=\sum _{k=1} ^{j-1} f[i-1][i-1-k+1]f[i][j]=∑k=1j−1​f[i−1][i−1−k+1]

=>f[i][j]=∑k=1j−1f[i−1][i−k]f[i][j]=\sum _{k=1} ^{j-1} f[i-1][i-k]f[i][j]=∑k=1j−1​f[i−1][i−k]

=>f[i][j]=∑k=i−j+1i−1f[i−1][k]f[i][j]=\sum _{k=i-j+1} ^{i-1} f[i-1][k]f[i][j]=∑k=i−j+1i−1​f[i−1][k]

=>f[i][j−1]=∑k=i−j+2i−1f[i−1][k]f[i][j-1]=\sum _{k=i-j+2} ^{i-1} f[i-1][k]f[i][j−1]=∑k=i−j+2i−1​f[i−1][k]

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

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

推导真妙啊。

注意要特判只有一个的情况。

以及要用滚动数组优化空间233

代码:

#include<bits/stdc++.h>
#define N 4205
using namespace std;
int f[2][N],p,n,ans=0,tmp=0;
int main(){
	scanf("%d%d",&n,&p);
	if(n==1)return cout<<1,0;
	f[tmp][1]=1;
	for(int i=2;i<=n;++i){
		tmp^=1;
		for(int j=1;j<=i;++j)f[tmp][j]=(f[tmp][j-1]+f[tmp^1][i-j+1])%p;
	}
	for(int i=1;i<=n;++i){
		ans+=f[tmp][i];
		if(ans>=p)ans-=p;
	}
	ans<<=1;
	if(ans>=p)ans-=p;
	cout<<ans;
	return 0;
}

2018.10.20 bzoj1925: [Sdoi2010]地精部落(dp)的更多相关文章

  1. [BZOJ1925][SDOI2010]地精部落(DP)

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

  2. BZOJ 1925: [Sdoi2010]地精部落( dp )

    dp(i,j)表示1~i的排列中, 以1~j为开头且开头是下降的合法方案数 这种数列具有对称性, 即对于一个满足题意且开头是上升的n的排列{an}, 令bn = n-an+1, 那么{bn}就是一个满 ...

  3. bzoj1925 [Sdoi2010] 地精部落【DP】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1925 一个多月前“过”了这道题,还自欺欺人地认为懂了这道题,这直接导致了昨晚多校联测2的T3 ...

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

    地精部落 bzoj-1925 Sdoi-2010 题目大意:给你一个数n和模数p,求1~n的排列中满足每一个数的旁边两个数,要么一个是边界,要么都比它大,要么都比它小(波浪排列个数) 注释:$1\le ...

  5. BZOJ1925 [Sdoi2010]地精部落 【dp】

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

  6. BZOJ1925[SDOI2010]地精部落

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

  7. 【czy系列赛】czy的后宫4 && bzoj1925 [Sdoi2010]地精部落

    [问题描述] czy有很多妹子,妹子虽然数量很多,但是质量不容乐观,她们的美丽值全部为负数(喜闻乐见). czy每天都要带N个妹子到机房,她们都有一个独一无二的美丽值,美丽值为-1到-N之间的整数.他 ...

  8. [bzoj1925][Sdoi2010][地精部落] (序列动态规划)

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

  9. BZOJ1925 [Sdoi2010]地精部落 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1925 题意概括 给出n,n<=4200,问1~n这些数的排列中,有多少满足一下性质: 性质: ...

随机推荐

  1. getitem, setitem, delitem (把类实例化成字典的类型)

    class Foo(object):     def __init__(self):         self.data = {} def __getitem__(self, key):        ...

  2. CentOS 7 JDK安装

    官网:  http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 1.下载(下图有个错误 ...

  3. 常用HTTP状态码

    1.常用状态码介绍 在http响应协议中,我们通过HttpWatch抓包抓取到响应信息.其中响应首行中就包含一个状态码.状态码由三位数字组成,表示请求是否被理解或者被满足.HTTP响应状态码的第一个数 ...

  4. json decimal and datetime

    python json模块默认不能序列化decimal和datetime数据,可以通过自定义一个序列化的类实现: link: http://www.cnblogs.com/buxizhizhoum/p ...

  5. iOS Hardware Guide

    来自U3D文档 Hardware models The following list summarizes iOS hardware available in devices of various g ...

  6. 使用css技术代替传统的frame技术

    http://www.dynamicdrive.com/style/layouts/item/css-left-frame-layout/ <!--Force IE6 into quirks m ...

  7. cmd 命令相关

    计算相关进程数: tasklist|find /i "cmd.exe" 安装git的可以 tasklist|find /i "cmd.exe"  | wc -l

  8. easyui input未设id导致的问题

    今天又踩了一个坑,大致是没有给input设id,使用类选择器绑定easyui控件,然后使用name设值,现在值设进去后界面没有显示. 做的界面部分截图如图: 点击下面两个橙色的按钮,通过调用下面的方法 ...

  9. Eclipse编辑jsp不显示预览效果页面

    转载链接:https://blog.csdn.net/fishsr/article/details/22662787 转载 2014年03月31日 13:35:35 1.Eclipse打开jsp后,在 ...

  10. eclispe 通过git向码云上传

    本文将介绍如何将本地的项目提交到开源中国上去,过程比较详细,实现起来很简单.由于自己也算是一个新手,所以没有做过多的解释,只是单纯的描述了该如何去做. 1.在开源中国上面新建一个空项目 到这里也就结束 ...