zoukankan      html  css  js  c++  java
  • bzoj 1996: [Hnoi2010]chorus 合唱队

    Description

    Input

    Output

    Sample Input

    4
    1701 1702 1703 1704

    Sample Output

    8

    HINT

     

    Source

    因为只会在区间的两端进行操作,这很容易让我们想到一种区间dp的模型。。。

    dp[i][j]表示区间[i,j]已经匹配上了的方案数,因为我们需要知道上一个填的数是什么所以多加一维,

    dp[i][j][0]表示最后填的数在区间左边,dp[i][j][1]表示最后填的数在区间右边,

    这样我们可以确切的知道上一个填的数。。。。

    那么转移就很显然了:

    dp[i][j][0]=dp[i+1][j][0]*(h[i]<h[i+1])+dp[i+1][j][1]*(h[i]<h[j]);

    dp[i][j][1]=dp[i][j-1][0]*(h[j]>h[i])+dp[i][j-1][1]*(h[j]>h[j-1]);

    然而第一个方程i+1==j的时候会加两次,第二个方程j-1==i的时候也会加两次,所以判一下。。。

    // MADE BY QT666
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<iostream>
    #include<cstring>
    using namespace std;
    typedef long long ll;
    const int N=1050;
    const int Mod=19650827;
    int dp[N][N][2],h[N],n;
    int main(){
      freopen("chorus.in","r",stdin);
      freopen("chorus.out","w",stdout);
      scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&h[i]);
      for(int i=1;i<=n;i++) dp[i][i][0]=dp[i][i][1]=1;
      for(int i=n;i>=1;i--){
        for(int j=i+1;j<=n;j++){
          if(h[i]<h[j]) (dp[i][j][0]+=dp[i+1][j][1])%=Mod;
          if(h[i]<h[i+1]&&i+1!=j) (dp[i][j][0]+=dp[i+1][j][0])%=Mod;
          if(h[j]>h[i]) (dp[i][j][1]+=dp[i][j-1][0])%=Mod;
          if(h[j]>h[j-1]&&j-1!=i) (dp[i][j][1]+=dp[i][j-1][1])%=Mod;
        }
      }
      printf("%d
    ",(dp[1][n][0]+dp[1][n][1])%Mod);
      return 0;
    }
    

      

  • 相关阅读:
    32位与64位操作系统到底有什么区别呢?
    chr()、unichr()和ord()
    Python map filter reduce
    as3.0横向渐变发光字
    Python time format
    Python 使用sys重定向
    as3.0给文字加纹理效果
    my first python
    字符编码(转)
    SWFTOOLS学习笔记一(转)
  • 原文地址:https://www.cnblogs.com/qt666/p/7360538.html
Copyright © 2011-2022 走看看