题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1925

要怎样才能想出正解呢?

当然有一维表示从1到 i 。

  发现最后是递增的方案数=最后是递减的方案数,因为其实按值把 j 变成 i - j + 1 就行了。所以记一个递增或递减,ans*=2就行了。

指定新来一个数只能加到末尾,所以第二维记录末尾的数是 j 且是递增或递减;

如果新来的数只能加到末尾,怎么保证求了所有情况?

  需要换个想法:不是前 i 个数,而是前n个数里的 i 个数;不是末尾是 j ,而是末尾是第 j 小的数。

  因为最后会求满n个数,所以前期不用乘什么(比如1324不用乘什么来涵盖2435,因为在一共有n个数的时候,5就会出现在后面了)。

  这样好像就不错了。

怎么推?来自阿当学长的博客:https://blog.csdn.net/aarongzk/article/details/44871391

  发现递增和递减之间有两个关系:如果用f [ ] [ ]表示最后递增,g [ ] [ ] 表示最后递减,则

  f [ i ] [ j ] = ∑(k∈[1,j-1])g [ i-1 ] [ k ];g [ i ] [ j ] = f [ i ] [ i - j + 1 ];

  于是 f [ i ] [ j ] = ∑(k∈[1,j-1]) f [ i - 1 ] [ i - j ];

  即 f [ i ] [ j ] = ∑(k∈[i-1,i-j+1]) f [ i - 1 ] [ k ];

  发现f [ i ] [ j-1 ] = ∑(k∈[i-1,i-j+2]) f [ i - 1 ] [ k ];

  所以f [ i ] [ j ] = f [ i ] [ j - 1 ] + f [ i - 1 ] [ i - j + 1 ];

  真是太美好了。

但是自己怎么才能想出来呢?

  首先第二维按套路应该记一个具体的数。然后发现递增和递减的微妙等价关系,于是设计两个数组表示递增和递减,最后推得美妙式子吗?

  前提是思想灵活一点,就能知道可以指定新来的数加在最后面,进而得出种种状态设计吧。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=;
int n,p,f[][N],ans;
int main()
{
scanf("%d%d",&n,&p);
f[][]=;//因为f[1][1]=1
for(int i=;i<=n;i++)
for(int j=;j<=i;j++)
f[i&][j]=(f[i&][j-]+f[(i-)&][i-j+])%p;
for(int j=;j<=n;j++)
(ans+=f[n&][j])%=p;
(ans<<=)%=p;
printf("%d",ans);
return ;
}

bzoj1925(SCOI2010)地精部落的更多相关文章

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

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

  2. 【bzoj1925】地精部落[SDOI2010](dp)

    题目传送门:1925: [Sdoi2010]地精部落 这道题,,,首先可以一眼看出他是要我们求由1~n的排列组成,并且抖来抖去的序列的方案数.然后再看一眼数据范围,,,似乎是O(n^2)的dp?然后各 ...

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

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

  4. BZOJ1925[SDOI2010]地精部落

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. PHP获取代码段执行的毫秒时间和消耗内存

    我们在项目开发经常需要做一些优化型测试,比如优化代码段,排查代码段效率问题,或者降低内存消耗成本. <?php $start_memory = memory_get_usage(); //开始内 ...

  2. STM32时钟树

    STM32的时钟系统 相较于51单片机,stm32的时钟系统可以说是非常复杂了,我们现在看下面的一张图: 上图说明了时钟的走向,是从左至右的从时钟源一步步的分配给外设时钟.需要注意的是,上图左侧一共有 ...

  3. 关于Drupal中使用hook_schema建立数据库报错PDOException: SQLSTATE[42000]的解决办法

    报错信息如下:PDOException: SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too l ...

  4. Java编程学习之JDBC连接MySQL

    JDBC连接MySQL 一.对JDBC连接数据库的步骤1.加载数据库驱动//加载驱动Class.forName(driverClass)-------------------------------- ...

  5. 【软件位置】Linux查看软件安装的位置

    如果我们在Linux 系统上安装了某个软件,我们可以通过如下的三种方式来确定. 一.        Which 命令 Shell 的which 命令可以找出相关命令是否已经在搜索路径中. 如: [ro ...

  6. SDN原理 控制层 Controller控制器

    本文参照SDN原理视频而成:SDN原理 Controller 概念 从上面这个图片,我们能够知道,Controller 是一个非常重要的东西:承上启下,左右拓展. 从整个SDN的架构来看,控制器 处在 ...

  7. trim()不兼容ie的问题及解决方法

    当输入 src.trim();时,ie浏览器不支持此属性和方法,解决方法: //ie兼容trim方法if(!String.prototype.trim) { String.prototype.trim ...

  8. C# typeof 与GetType()的区别

    C#中Type类的介绍:https://msdn.microsoft.com/zh-cn/library/system.type(VS.80).aspx C#中任何对象都具有GetType()方法,它 ...

  9. Matplotlib 练习题

    1. 绘制一个二维随机漫步的图形 直接上代码: %pylab inline nsteps = 1000 draws = np.random.randint(-1,2,size=(2,nsteps)) ...

  10. python 返回列表中的偶数

    def is_even_num(l): enum = [] for n in l: == : enum.append(n) return enum print(is_even_num([, , , , ...