91求调
查看原帖
91求调
1039717
Andy_hpy楼主2025/2/7 10:10
#include <bits/stdc++.h>
#include <unistd.h>
#define init(a,b) memset(a,b,sizeof(a));
typedef long long ll;
typedef double db;
typedef long double ldb;
using namespace std;
const ll MAXN=105;
string str;
ll dp[MAXN][MAXN],c[MAXN][MAXN],f[MAXN][MAXN];
ll calc(ll x){
	ll ans=0;
	while(x){
		x/=10;
		++ans;
	}
	return ans;
}
void check(ll l,ll r,ll k){
	if((r-l+1)%k!=0){
		return;
	}
	for(ll i=l;i+k<=r;++i){
		if(str[i]!=str[i+k]){
			return;
		}
	}
	ll t=2+calc((r-l+1)/k)+dp[l][l+k-1];
	if(t<dp[l][r]){
		dp[l][r]=t;
		c[l][r]=0;
		f[l][r]=k;
	}
}
void dfs(ll l,ll r){
	if(!c[l][r]&&!f[l][r]){
		for(ll i=l;i<=r;++i){
			cout<<str[i];
		}
	}else if(c[l][r]){
		dfs(l,c[l][r]);
		dfs(c[l][r]+1,r);
	}else{
		cout<<(r-l+1)/f[l][r]<<"(";
		dfs(l,l+f[l][r]-1);
		cout<<")";
	}
}
int main() {
	cin>>str;
	ll n=str.size();
	str=" "+str;
	init(dp,0x7f);
	init(c,0);
	init(f,0);
	for(ll i=1;i<=n;++i){
		dp[i][i]=1;
	}
	for(ll len=2;len<=n;++len){
		for(ll i=1;i+len-1<=n;++i){
			ll j=i+len-1;
			for(ll k=1;k<=(j-i+1)/2;++k){
				check(i,j,k);
			}
			for(ll k=i;k<j;++k){
				if(dp[i][j]>dp[i][k]+dp[k+1][j]){
					dp[i][j]=dp[i][k]+dp[k+1][j];
					c[i][j]=k;
					f[i][j]=0;
				}
			}
		}
	}
	dfs(1,n);
	cout<<endl;
	return 0;
}

评测记录

2025/2/7 10:10
加载中...