1 条题解
-
0
#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
- 上传者