zoukankan      html  css  js  c++  java
  • [SDOI2010]地精部落

    题解:

    一道不错的dp

    方法1:

    首先会发现它的要求就是数列是摆动的

    然后算法大体上是dp方向

    会发现这道题对大小之间的差距并没有高的要求

    比如 1,3,5与1,2,3实际是等效的

    用一个套路:枚举最大值将序列分割

    用f[i][0]表示上升,f[i][1]表示下降

    转移的话应该挺显然的,最大值右边显然是一个上升序列,左边嘛要根据元素个数判断一下

    方法2:

    这个是正解。。看上去很简单,但自己想不出来啊。。

    状态不难设

    令f[i][j]表示取前i个数的排列,其中第一个数为j的方案数,下降

    考虑转移,满满的递推思想啊。。

    性质1:

    对于某个排列来说,若j,j-1不相临,他们是可以互换的(虽然显然但自己想不到啊。。)

    这样当f[i][j]中j与j-1不相邻的时候,就等于f[i][j-1]

    性质2(其实不重要):

    就是上升变下降 g[i][j]=f[i][i-j]

    对于某个排列来说,若j,j-1相邻,那么问题就变为了在i-1个元素里,第一个是j-1的上升序列

    网上大都是f[i-1][i-j]。。。其实处理个g数组不是差不多么。。

    另外对于初值,f[1][1]=1;其余f[i][1]=0;第一个是1还怎么下降。。

  • 相关阅读:
    C++常变量
    C++变量(C++变量定义、变量赋值、命名规则)
    463. Island Perimeter
    500. Keyboard Row
    811. Subdomain Visit Count
    901. Online Stock Span
    419. Battleships in a Board
    620. Not Boring Movies
    893. Groups of Special-Equivalent Strings
    575. Distribute Candies
  • 原文地址:https://www.cnblogs.com/yinwuxiao/p/8719547.html
Copyright © 2011-2022 走看看