• BZOJ 1090: [SCOI2003]字符串折叠


    Time Limit: 10 Sec Memory Limit: 162 MB
    Submit: 1916 Solved: 1257
    [Submit][Status][Discuss]
    Description

    折叠的定义如下: 1. 一个字符串可以看成它自身的折叠。记作S  S 2. X(S)是X(X>1)个S连接在一起的串的折叠。记作X(S)  SSSS…S(X个S)。 3. 如果A  A’, BB’,则AB  A’B’ 例如,因为3(A) = AAA, 2(B) = BB,所以3(A)C2(B)  AAACBB,而2(3(A)C)2(B)AAACAAACBB 给一个字符串,求它的最短折叠。例如AAAAAAAAAABABABCCD的最短折叠为:9(A)3(AB)CCD。

    Input

    仅一行,即字符串S,长度保证不超过100。

    Output

    仅一行,即最短的折叠长度。

    Sample Input

    NEERCYESYESYESNEERCYESYESYES
    Sample Output

    14
    HINT

    一个最短的折叠为:2(NEERC3(YES))

    题解

    区间dp,dp[i][j]表示区间[i,j]合并后的最小值。枚举时要先判断是否有可合并的串。
    

    代码

    #include<bits/stdc++.h>
    
    using namespace std;
    const int MAXN = 105;
    
    char c[MAXN];
    int dp[MAXN][MAXN],leen;
    
    inline bool judge(int x,int y,int z){
        for(int i=1;i<=leen;i++)
            for(int j=x+i-1;j+z<=y;j+=z)
                if(c[j]!=c[j+z]) return false;
        return true;
    }
    
    inline int cal(int k){
        if(k==100) return 3;
        if(k/10!=0) return 2;
        return 1;
    }
    
    int main(){
        scanf("%s",c+1);
        memset(dp,0x3f,sizeof(dp));
        leen=strlen(c+1);
        for(int i=0;i<=leen;i++)
            dp[i][i]=1;
        for(int l=0;l<=leen;l++)
            for(int i=1;i<=leen-l;i++){
                int j=i+l;
                for(int k=1;k<=(l+1)>>1;k++){    //枚举重复串的长度并判断是否合法。 
                    if(judge(i,j,k) and (l+1)%k==0)
                        dp[i][j]=min(dp[i][j],dp[i][k+i-1]+2+cal((l+1)/k)) ;
                }
                for(int k=i;k<j;k++)   //枚举中间位置。 
                    dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]);
            }
    //  for(register int i=1;i<=leen;i++)
    //      for(register int j=1;j<=leen;j++)
    //          cout<<dp[i][j]<<" ";
        cout<<dp[1][leen];
        return 0;
    }
  • 相关阅读:
    [引用]SQLServer占CPU100%
    负能量程序员杂谈(2)- 管理中的情和义
    负能量程序员杂谈(1)-世界上最单纯的职业:程序员
    FLV文件格式官方规范详解
    rtmp官方标准规范详细解析
    万恶的KPI、新兴的OKR及让人纠结的程序员考核
    管理点滴(一)
    选拨管理者的一个必要条件
    团队管理的简单总结:少即是多,体力透支,负能量管理,自我进化团队,沟通
    我的2015计划,目标
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9677071.html
Copyright © 2020-2023  润新知