BZOJ-1055: [HAOI2008]玩具取名(区间DP)

作者: AmadeusChan | 来源:发表于2019-02-16 20:01 被阅读0次

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

这几天脑子不太好尽刷些傻叉的水题。。。区间DP,没什么好说的。。。除了吐槽一下自己因为没删注释性输出而WA了好几次之外额。。。

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
 
using namespace std ;
 
#define rep( i , x ) for ( int i = 0 ; i ++ < x ; )
 
int getchr(  ) {
    int ch ; for ( ch = getchar(  ) ; ch != 'W' && ch != 'I' && ch != 'N' && ch != 'G' ; ch = getchar(  ) ) ;
    return ch == 'W' ? 0 : ( ch == 'I' ? 1 : ( ch == 'N' ? 2 : 3 ) ) ;
}
 
void putchr( int ch ) {
    switch ( ch ) {
        case 0 : putchar( 'W' ) ; break ;
        case 1 : putchar( 'I' ) ; break ;
        case 2 : putchar( 'N' ) ; break ;
        case 3 : putchar( 'G' ) ; break ;
    }
}
 
const int maxn = 210 ;
 
bool dp[ maxn ][ maxn ][ 4 ] , flag[ maxn ][ maxn ][ 4 ] ;
int n[ 4 ] , turn[ 4 ][ maxn ][ 2 ] , len ;
char s[ maxn ] ;
 
bool dfs( int l , int r , int c ) {
    if ( flag[ l ][ r ][ c ] ) return dp[ l ][ r ][ c ] ;
    if ( l == r ) {
        dp[ l ][ r ][ c ] = ( c == 0 && s[ l ] == 'W' ) || ( c == 1 && s[ l ] == 'I' ) || ( c == 2 && s[ l ] == 'N' ) || ( c == 3 && s[ l ] == 'G' ) ;
    } else {
        rep( i , n[ c ] ) {
            for ( int j = l ; j < r ; ++ j ) {
                dp[ l ][ r ][ c ] |= ( dfs( l , j , turn[ c ][ i ][ 0 ] ) && dfs( j + 1 , r , turn[ c ][ i ][ 1 ] ) ) ;
                if ( dp[ l ][ r ][ c ] ) break ;
            }
            if ( dp[ l ][ r ][ c ] ) break ;
        }
    }
    flag[ l ][ r ][ c ] = true ;
    return dp[ l ][ r ][ c ] ;
}
 
int main(  ) {
    memset( dp , false , sizeof( dp ) ) ;
    memset( flag , false , sizeof( flag ) ) ;
    for ( int i = 0 ; i < 4 ; ++ i ) scanf( "%d" , n + i ) ;
    for ( int i = 0 ; i < 4 ; ++ i ) {
        rep( j , n[ i ] ) {
            turn[ i ][ j ][ 0 ] = getchr(  ) ;
            turn[ i ][ j ][ 1 ] = getchr(  ) ;
        }
    }
    scanf( "%s" , s + 1 ) ;
    len = strlen( s + 1 ) ;
    bool F = false ;
    for ( int i = 0 ; i < 4 ; ++ i ) if ( dfs( 1 , len , i ) ) {
        putchr( i ) ; F = true ;
    }
    if ( ! F ) printf( "The name is wrong!" ) ;
    putchar( '\n' ) ;
    return 0 ; 
}

相关文章

  • BZOJ-1055: [HAOI2008]玩具取名(区间DP)

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

  • 「动态规划」例题之状态和转移方程的设计(2)

    0x50「动态规划」例题 区间DP 线性DP从初态开始,沿着“阶段”向某个方向扩张。而区间DP是线性DP的一种,它...

  • 区间类DP总结

    区间类DP的做法,是用memorized search,把大区间拆分为小区间来解。而dp[i][j] 则直观的表示...

  • 区间DP和回文为主题的DP

    区间DP 区间DP的特征: 可以两个或多个部分进行整合, 或者反过来;能将问题分解为能两两合并的形式.区间DP的求...

  • 区间DP

    区间DP,对于每段小区间,它的最优值是由更小的区间的最优值得出的,由此往下划分,直到单个元素,由他们的组合合并得出...

  • 区间DP

    模板区间dp一般由小区间推出大的区间: http://acm.hdu.edu.cn/showproblem.php...

  • 区间DP

    石子合并 原题链接[https://www.acwing.com/problem/content/284/] 2....

  • DP小结

    DP种类 线性DP 区间DP 树形DP 背包DP01背包满背包完全背包(转成01背包) 例子:线性动规:拦截导弹,...

  • DP模板之---区间DP

    一.经典例题 题目地址: 【P1880】[NOI1995]石子合并 - 洛谷 二.分析 转移方程 dp_max[i...

  • LeetCode 区间dp

    1553. 吃掉 N 个橘子的最少天数 5498. 石子游戏 V

网友评论

    本文标题:BZOJ-1055: [HAOI2008]玩具取名(区间DP)

    本文链接:https://www.haomeiwen.com/subject/ngmieqtx.html