BZOJ-1090: [SCOI2003]字符串折叠(区间dp)

作者: AmadeusChan | 来源:发表于2018-11-19 18:20 被阅读0次

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

大水题,随便搞一个O(n^3)的区间DP就A了额。。。

代码:

#include <cstdio>

#include <algorithm>
#include <cstring>
 
using namespace std ;
 
#define cost( l , r ) ( r - l + 1 ) > len[ l ][ r ] ? min( r - l + 1 , COUNT( ( r - l + 1 ) / len[ l ][ r ] ) + 2 + dp( l , l + len[ l ][ r ] - 1 ) ) : ( r - l + 1 )
#define maxn 110
 
int f[ maxn ][ maxn ] , n , pre[ maxn ][ maxn ] , len[ maxn ][ maxn ] ;
char s[ maxn ] ;
 
void kmp(  ) {
    for ( int i = 0 ; i ++ < n ; ) {
        pre[ i ][ 1 ] = 0 ; 
        for ( int k = 2 , j = 0 ; k <= n - i + 1 ; ++ k ) {
            for ( ; j && s[ i + j ] != s[ i + k - 1 ] ; j = pre[ i ][ j ] ) ;
            if ( s[ i + j ] == s[ i + k - 1 ] ) ++ j ;
            pre[ i ][ k ] = j ;
        }
        for ( int j = i ; j <= n ; ++ j ) {
            if ( ! ( ( j - i + 1 ) % ( j - i + 1 - pre[ i ][ j - i + 1 ] ) ) ) {
                len[ i ][ j ] = j - i + 1 - pre[ i ][ j - i + 1 ] ;
            } else len[ i ][ j ] = j - i + 1 ;
        }
    }
}
 
int COUNT( int x ) {
    int cnt = 0 ;
    for ( ; x ; x /= 10 ) ++ cnt ;
    return cnt ;
}
 
int dp( int l , int r ) {
    if ( f[ l ][ r ] ) return f[ l ][ r ] ;
    f[ l ][ r ] = cost( l , r ) ;
    for ( int i = l ; i < r ; ++ i ) {
        f[ l ][ r ] = min( f[ l ][ r ] , dp( l , i ) + dp( i + 1 , r ) ) ;
    }
    return f[ l ][ r ] ;
}
 
int main(  ) {
    scanf( "%s" , s + 1 ) ;
    n = strlen( s + 1 ) ;
    kmp(  ) ;
    memset( f , 0 , sizeof( f ) ) ;
    printf( "%d\n" , dp( 1 , n ) ) ;
    return 0 ;
}

相关文章

  • BZOJ-1090: [SCOI2003]字符串折叠(区间dp)

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

  • 「动态规划」例题之状态和转移方程的设计(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-1090: [SCOI2003]字符串折叠(区间dp)

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