现在的位置: 首页 > 综合 > 正文

1090: [SCOI2003]字符串折叠 (区间动态规划)

2018年04月24日 ⁄ 综合 ⁄ 共 604字 ⁄ 字号 评论关闭
#include<iostream>
#include<cstring>
#include<cstdio>
#define inf 0x7fffffff
using namespace std;
char s[101];
int n,f[101][101];
bool mark[101][101];
inline bool jud(int l,int r,int cl,int cr){
	if((r-l+1)%(cr-cl+1)!=0)return 0;
    for(int i=l;i<=r;i++)
	    if(s[i]!=s[(i-l)%(cr-cl+1)+cl])return 0;
    return 1;
}
int get(int x){
	int t=0;
	while(x){x/=10;t++;}
	return t;
}
inline int dp(int l,int r){
	if(l==r)return 1;
	if(mark[l][r])return f[l][r];
	mark[l][r]=1;
	int t=r-l+1;
	for(int i=l;i<r;++i){
		t=min(t,dp(l,i)+dp(i+1,r));
		if(jud(i+1,r,l,i))
            t=min(t,dp(l,i)+2+get((r-i)/(i-l+1)+1)); 
	}
	return f[l][r]=t;
}
int main(){
	scanf("%s",s);
	n=strlen(s)-1;
	printf("%d",dp(0,n));
	return 0;
}

抱歉!评论已关闭.