SCP-bzoj-1090

本文介绍了一种使用区间动态规划解决字符串压缩问题的方法。通过定义状态f[i][j]来表示从第i位到第j位的字符串压缩后的最短长度,并提供了三种状态转移方式。最终实现了一个O(n²(σ²(n)+n))复杂度的算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目编号:bzoj-1090

项目等级:Safe

项目描述:

  戳这里

特殊收容措施:

  区间DP。设计状态f[i][j]表示压缩从第i位到第j位的字符串所需的最小长度。转移方式有三种:

  •初始化:j-i+1->f[i][j]

  •区间分割:f[i][k]+f[k+1][j]->f[i][j]

  •子串复制(前提:子串i~j可分成长度为k的多个相同子串):f[i][i+k-1]+digit(k)+2->f[i][j](digit(x)表示x的十进制位数)

  总复杂度O(n22(n)+n))。

附录:

 1 #include <bits/stdc++.h>
 2 #define range(i,c,o) for(register int i=(c);i<(o);++i)
 3 using namespace std;
 4 
 5 char str[105];
 6 inline bool judge(const int&L,const int&R,const int&K)
 7 {
 8     range(i,0,K) for(int j=L+i;j+K<=R;j+=K)
 9     {
10         if(str[j]!=str[j+K]) return 0;
11     }
12     return 1;
13 }
14 
15 int f[105][105];
16 int main()
17 {
18     int N=strlen(gets(str));
19     range(L,0,N) range(R,L,N) f[L][R]=R-L+1;
20     range(len,2,N+1) range(L,0,N-len+1)
21     {
22         int R=L+len-1;
23         range(i,1,int(sqrt(len))+1) if(len%i==0)
24         {
25             int x=i,y=len/i;
26             if(judge(L,R,x)) f[L][R]=min(f[L][R],f[L][L+x-1]+int(log10(y))+3);
27             if(judge(L,R,y)) f[L][R]=min(f[L][R],f[L][L+y-1]+int(log10(x))+3);
28         }
29         range(i,L,R) f[L][R]=min(f[L][R],f[L][i]+f[i+1][R]);
30     }
31     return printf("%d\n",f[0][N-1]),0;
32 }
View Code

 

转载于:https://www.cnblogs.com/spactim/p/6921480.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值