卧薪尝胆,厚积薄发。
SCOI2003 字符串折叠
Date: Wed Sep 19 16:31:50 CST 2018 In Category: NoCategory

Description:

一个字符串,可以把相同的部分折叠起来,问最短能折叠到多短。
$1\le n \le 100$

Solution:

区间 $DP$ ,枚举折叠长度,时间复杂度 $O(n^4)$ 但跑不满。

Code:


#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
#define MAXL 110
char s[MAXL];
int n;
int f[MAXL][MAXL];
bool get(int l,int r,int len)
{
if((r - l + 1) % len != 0)return false;
for(int i = l + len;i <= r;++i)
{
if(s[i] != s[i - len])return false;
}
return true;
}
int cnt(int k)
{
int res = 0;
while(k > 0)
{
++res;
k /= 10;
}
return res;
}
int main()
{
scanf("%s",s + 1);
n = strlen(s + 1);
memset(f,0x3f,sizeof(f));
for(int i = 1;i <= n;++i)f[i][i] = 1;
for(int l = 2;l <= n;++l)
{
for(int i = 1;i <= n - l + 1;++i)
{
int j = i + l - 1;
for(int k = i;k < j;++k)
{
f[i][j] = min(f[i][j],f[i][k] + f[k + 1][j]);
if(get(i,j,k - i + 1))f[i][j] = min(f[i][j],f[i][k] + cnt((j - i + 1) / (k - i + 1)) + 2);
}
}
}
cout << f[1][n] << endl;
return 0;
}
In tag: DP-区间DP
Copyright © 2020 wjh15101051
ღゝ◡╹)ノ♡