90分求助,wa了第9个点,代码有注释
查看原帖
90分求助,wa了第9个点,代码有注释
227666
ayanamire楼主2022/10/21 19:33
#include<bits/stdc++.h>
#define INF INT_MAX
using namespace std;
char s[51];
int f[51][51],lens,g[51];// f[i][j]表示从i到j可压缩的的最短长度 
bool check(int l,int r,int len)
{
	for(int i=l+len;i<=r;i++)
		if(s[i]!=s[(i-l)%len+l])return false;
	return true;
}
int solve(int l,int r,int len)
{
	//g(i)=g(i/2)+1+i%2*len
	//i表示循环节重复的个数 
	int num=(r-l+1)/len;
	memset(g,0,sizeof(g));
	g[1]=len;
	for(int i=1;i<=num;i++)
	{
		g[2*i]=g[i]+1;
		g[2*i+1]=g[i]+1+len;
		if(2*i==num||2*i+1==num)break;
	}
	if(l!=0)g[num]+=1;//如果左端点不在最左端 ,需要在最开头加一个M
	return g[num];
}
int main()
{
	scanf("%s",s);
	lens=strlen(s)-1;
	for(int i=0;i<=lens;i++)
		for(int j=0;j<=lens;j++)
			f[i][j]=INF;
	for(int i=0;i<=lens;i++)f[i][i]=1;
	for(int sul=2;sul<=lens+1;sul++)
		for(int i=0;i<=lens+1-sul;i++)
		{
			int j=sul+i-1;
			for(int k=i;k<=j-1;k++)//枚举断点 
				f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
			for(int k=i;k<=j-1;k++)//枚举循环节长度 
			{
				int len=k-i+1;
				if((j-i+1)%len!=0)continue;
				if(check(i,j,len)) 
					f[i][j]=min(f[i][j],solve(i,j,len));
			}
		}
	printf("%d",f[0][lens]);
	return 0;
}
2022/10/21 19:33
加载中...