UVA - 1630 Folding 递归记忆化搜索

博客分析了UVA 1630题目的解决方案,涉及字符串折叠问题,目标是找到给定字符串在允许嵌套折叠条件下的最短形式。博主探讨了状态转移方程,将问题划分为三种决策情况:不能压缩、部分压缩和整体压缩,以优化时间复杂度。
摘要由CSDN通过智能技术生成

问题

问题就是折叠字符串,例如ACBACB可以折叠成2(ACB),并且折叠可以嵌套,字符串长度是n(1<n<=100),求最短的折叠

分析

状态比较易懂,dp[i][j]代表[i,j]这一段能压缩成的最短字符串
然后分为三种情况决策,1.不能压缩的 2.能部分压缩的(就是分开后再压缩) 3.整体能压缩的

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
const int maxn=105;
//int slen[maxn][maxn];
string dp[maxn][maxn],str;

//计算重复的最小长度
int fold(const string &s){
   
    int len=s.length();
    for(int i=1;i*2<=len;++i){
   
        if(len%i) continue;
        bool isFold=true;
        for(int j=0;j<len-i;++j){
   
            if(s[j]!=s[j+i]){
   
                isFold=false;
                break;
            }
        }
        if(isFold) return i;
    }
    return 0;
}

//折叠分为三种情况 1.不能折叠 2.部分折叠 3.整体都能折叠
int DFS(int left,int right){
   
    string &ans=dp[left][right];
    if(ans!=""
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值