求助,60分,悬两关注。
查看原帖
求助,60分,悬两关注。
561632
Chis725楼主2023/8/7 20:33

qwq,调了好久了。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int INF=999999999;
string s;
int n,f[51][51][2];
void check(int a,int b,int l){
	l=(b-a+1)/l;
	for(int i=a;i<=b;i++){
		if(s[(i-a)%l+a]!=s[i]){
			return ;
		}
	}
	if(a!=1)f[a][b][1]=min(f[a][b][1],(int)(log2((b-a+1)/l))+l+1);
	else f[a][b][1]=min(f[a][b][1],(int)(log2((b-a+1)/l))+l);
}
signed main(){
	cin>>s;
	n=s.size();
	s=' '+s;
	for(int i=1;i<=n;i++){f[i][i][0]=1;f[i][i][1]=INF;}
	for(int len=2;len<=n;len++){
		for(int i=1;i+len-1<=n;i++){
			int j=i+len-1;
			f[i][j][0]=len;
			f[i][j][1]=INF;
			for(int k=i;k<j;k++)f[i][j][1]=min(f[i][j][1],min(f[i][k][0],f[i][k][1])+min(f[k+1][j][0],f[k+1][j][1]));
			for(int k=2;k<=len/2;k*=2){
				if(len%k!=0)break;
				check(i,j,k);
			}
		}
	}
	cout<<min(f[1][n][0],f[1][n][1]);
	return 0;
}

评测记录

2023/8/7 20:33
加载中...