40分,区间DP,答案小,求助!
查看原帖
40分,区间DP,答案小,求助!
280015
Star_Cried楼主2020/7/27 17:03
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<ctype.h>
#include<string>
#define R register
using namespace std;
char s[55];
int f[55][55];
bool tag[55];
int len;
inline bool check(int l,int r)
{
	int mid=(r-l>>1)+1;
	for(int i=l;i<=l+r>>1;i++)if(s[i]!=s[i+mid])return 0;
	return 1;
}
int main()
{
	scanf("%s",s);
	len=strlen(s);
	for(int i=0;i<len;i++)
		for(int j=i;j<len;j++)f[i][j]=j-i+1;
	for(int l=1;l<len;l++)
		for(int i=0,j=i+l;j<len;i++,j++)
			{
				for(int k=i;k<j;k++){
					f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
				}
				if(!l%2)continue;
				int k=i+j>>1;
				if(check(i,j)){
					if(!tag[i] and i!=0){
						if(f[i][k]+2<f[i][j])f[i][j]=f[i][k]+2,tag[i]=1;
					}
					else 
					{
						f[i][j]=min(f[i][j],f[i][k]+1);
					}
				}
				
			}
	printf("%d",f[0][len-1]);
	return 0;
}
/*
aaababababababaababbaabaabbbbbbbbbaaaaaaxaaaaaa 36

acbcabccabbbcbbcbbbcbabbcbcacaacabcbabbacacbaac 44

aaMabRRababaMabRMbaaRMbRRRbMaRRaaxaaaaaa
*/
2020/7/27 17:03
加载中...