信息学竞赛题解(IO题解)算法与数据结构数据结构和算法分析

BZOJ-1996: [Hnoi2010]chorus 合唱队(

2019-02-16  本文已影响0人  AmadeusChan

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1996

区间DP,注意len=2的处理不要重复即可。

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
 
using namespace std ;
 
#define rep( i , x , y ) for ( int i = x ; i <= y ; ++ i )
 
const int maxn = 1010 ;
const int mod = 19650827 ;
 
void update( int &N , int delta ) {
        ( N += delta ) %= mod ;
}
 
int dp[ maxn ][ maxn ][ 2 ] , n , a[ maxn ] ;
 
int main(  ) {
        scanf( "%d" , &n ) ;
        rep( i , 1 , n ) scanf( "%d" , a + i ) ;
        memset( dp , 0 , sizeof( dp ) ) ;
        rep( i , 1 , n ) dp[ i ][ i ][ 0 ] = 1 ;
        rep( i , 2 , n ) rep( j , 1 , n - i + 1 ) {
               int l = j , r = j + i - 1 ; 
               update( dp[ l ][ r ][ 0 ] , dp[ l + 1 ][ r ][ 0 ] * ( a[ l ] < a[ l + 1 ] ) ) ;
               update( dp[ l ][ r ][ 0 ] , dp[ l + 1 ][ r ][ 1 ] * ( a[ l ] < a[ r ] ) ) ;
               update( dp[ l ][ r ][ 1 ] , dp[ l ][ r - 1 ][ 0 ] * ( a[ r ] > a[ l ] ) ) ;
               update( dp[ l ][ r ][ 1 ] , dp[ l ][ r - 1 ][ 1 ] * ( a[ r ] > a[ r - 1 ] ) ) ;
        }
        printf( "%d\n" , ( dp[ 1 ][ n ][ 0 ] + dp[ 1 ][ n ][ 1 ] ) % mod ) ;
        return 0 ; 
}
上一篇 下一篇

猜你喜欢

热点阅读