题意:
给你一个未压缩串,要求你把它压缩
问你压缩后最小长度
题解:
区间dp
怎么少就怎么来
代码:
#include<bits/stdc++.h> using namespace std; char s[100]; int f[60][60][2],mark[60][60][2]; int same(int a,int b) { int l=b-a+1; if (l&1)return 0; for (int i=a;i<=(a+b)/2;i++) if (s[i]!=s[i+l/2])return 0; return 1; } int dp(int a,int b,int t) { int tmp=b-a+1; if (tmp==1)return 1; if (mark[a][b][t])return f[a][b][t]; mark[a][b][t]=1; if (t) for(int i=a;i<b;i++)tmp=min(tmp,dp(a,i,1)+dp(i+1,b,1)+1); for (int i=a;i<b;i++)tmp=min(tmp,dp(a,i,t)+b-i); if (same(a,b))tmp=min(tmp,dp(a,(a+b)/2,0)+1); return f[a][b][t]=tmp; } int main() { scanf("%s",s+1); int l=strlen(s+1); printf("%d",dp(1,l,1)); return 0; }