求助,悬三关注,80pts
查看原帖
求助,悬三关注,80pts
754034
fly2024楼主2023/12/6 17:32
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e2+10,mod=1e9+7;
inline int read(){
	int c,w=0,n=0;
	while((c=getchar())<'0'||'9'<c) w=c=='-';
	do n=n*10+c-'0';while('0'<=(c=getchar())&&c<='9');
	return w?-n:n;
}
int write(int n){
	if(n<0) putchar('-'),n=-n;
	if(n>9) write(n/10);
	putchar(n%10+'0');
	return n;
}

int n,f[4][maxn][maxn];
char s[maxn];

signed main(){
	scanf("%s",s+1),n=strlen(s+1);
	for(int r=1;r<=n;++r){
		f[0][r][r]=f[1][r][r]=1;
		for(int l=r-1;l;--l){
			f[0][l][r]=r-l+1;
			if((r-l+1)&1||s[l]!=s[(l+r>>1)+1]) f[1][l][r]=f[0][l][r];
			else{
				f[1][l][r]=f[1][l][l+r>>1]+1,f[2][l][r]=l!=1;
				for(int i=l+1,j=(l+r>>1)+2;j<=r;++i,++j) if(s[i]!=s[j]) f[1][l][r]=f[0][l][r],f[2][l][r]=0,j=r;
			}
//			cout<<l<<" "<<r<<":"<<f[1][l][r]<<"|";
			f[0][l][r]=f[1][l][r];
			int flag=0;
			for(int i=l;i<r;++i){
				int x=f[1][l][i]+f[0][i+1][r]+f[2][i+1][r];
				if(x<f[0][l][r]||(x==f[0][l][r]&&!f[2][l][i]&&f[2][l][r]))
					f[0][l][r]=x,f[2][l][r]=f[2][l][i],flag|=!f[2][i+1][r];
			}
			if(flag) f[1][l][r]=min(f[1][l][r],f[0][l][r]);
//			cout<<f[0][l][r]<<"|"<<f[2][l][r]<<"]\n";
		}
	}
	write(f[0][1][n]);
	return 0;
}/*
这下面的hack数据都过了
wtcltclwtcltcl(8)
aaaabaaaab(5)

wtcltclR

aaababababababaababbaabaabbbbbbbbbaaaaaaxaaaaaa(36)
acbcabccabbbcbbcbbbcbabbcbcacaacabcbabbacacbaac(44)

*/
2023/12/6 17:32
加载中...