简单区间dp求助
  • 板块学术版
  • 楼主___A__
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/19 13:52
  • 上次更新2023/11/19 15:02:42
查看原帖
简单区间dp求助
275860
___A__楼主2023/11/19 13:52

P4302

#include<bits/stdc++.h>
using namespace std;
const int N=1e2+5;
int mem[N][N],n;
char a[N];
int calc(int x){
	int ret=0;
	while(x){
		ret++,x/=10;
	}
	return ret;
}
int check(int len,int l,int r){
	for(int i=l;i<=l+len-1;i++){
		for(int j=i;j<=r;j+=len){
			if(a[i]!=a[j]){
				return 0;
			}
		}
	}
	return 1;
}
int dfs(int l,int r){
	if(l==r){
		return 1;
	}
	if(mem[l][r]!=-1){
		return mem[l][r];
	}
	int ret=r-l+1;//不折叠
	for(int i=1;i<=r-l+1;i++){
		if((r-l+1)%i==0){
			if(check(i,l,r)){
				ret=min(ret,2+calc((r-l+1)/i)+i);
			}
		}
	}
	for(int i=l;i<r;i++){
		ret=min(ret,dfs(l,i)+dfs(i+1,r));
	}
	return mem[l][r]=ret;
}
int main(){
	cin>>a+1;
	n=strlen(a+1);
	memset(mem,-1,sizeof(mem));
	cout<<dfs(1,n);
}
2023/11/19 13:52
加载中...