题意:给个字符串,每次只能删除一段全为相同字母的区间,问删完这个字符串,最少需要多少次
解析:
(1) str[i]==str[j] ,dp[i][j] = dp[i+1][j-1] + 1;
(2) str[i] !=str[j] ,dp[i][j] = min( dp[i][j-1] , dp[i-1][j] )+1;
(3) dp[i][j] =min(dp[i][j],dp[i][k]+dp[k][j]-1);
ac:
#include<bits/stdc++.h>
#define MAXN 505
using namespace std;
char str[MAXN];
int dp[MAXN][MAXN];
int main()
{
int n;
scanf("%d",&n);
scanf("%s",s+1);
for(int i=1;i<=n;i++)
dp[i][i]=1;
for(int len=2;len<=n;len++)
{
for(int i=1,j=len;j<=n;i++,j++)
{
if(str[i]==str[j])
{
dp[i][j]=dp[i+1][j-1]+1;
}
else
{
dp[i][j]=min(dp[i][j-1],dp[i+1][j])+1;
}
for(int k=i;k<=j;k++)
{
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]-1);
}
}
}
printf("%d\n",dp[1][n]);
return 0;
}