1 条题解

  • 0
    @ 2022-9-5 22:13:51
    #include<bits/stdc++.h>
    #define re register int
    #define ll long long
    #define maxn 55
    using namespace std;
    char as[maxn];
    int dp[maxn][maxn][3];
    int n;
    int check(int l,int r){
    	if((r-l+1)&1)return 0;
    	int mid=(l+r)>>1;
    	for(re i=l;i<=mid;i++)
    		if(as[i]!=as[i+mid-l+1])return 0;
    	return 1;
    }//判断前一半是否和后一半相等
    int main(){
    	scanf("%s",as+1);
    	n=strlen(as+1);
    	memset(dp,0x3f,sizeof(dp));
    	for(re i=1;i<=n;i++)
    		for(re j=i;j<=n;j++)
    			dp[i][j][0]=dp[i][j][1]=(j-i+1);
    	for(re len=2;len<=n;len++)
    		for(re l=1;l+len-1<=n;l++){
    			int r=l+len-1;
    			if(check(l,r))dp[l][r][0]=min(dp[l][(l+r)/2][0]+1,dp[l][r][0]);
    		for(re k=l;k<r;k++){
    			dp[l][r][0]=min(dp[l][r][0],dp[l][k][0]+r-k);
    		}
    		for(re k=l;k<r;k++)
    			dp[l][r][1]=min(dp[l][r][1],min(dp[l][k][0],dp[l][k][1])+min(dp[k+1][r][0],dp[k+1][r][1])+1);
    		}
    		printf("%d\n",min(dp[1][n][1],dp[1][n][0]));
    	return 0;
    }
    
    
    • 1

    信息

    ID
    1068
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    (无)
    递交数
    15
    已通过
    12
    上传者