涂色
题目
解析
仿照石子合并的DP,不难弄出一个转移方程:
d
p
i
,
i
=
1
dp_{i,i}=1
dpi,i=1
d
p
i
,
j
=
{
m
i
n
(
d
p
i
,
j
−
1
,
d
p
i
+
1
,
j
)
(
s
i
=
=
s
j
)
m
i
n
(
d
p
i
,
k
+
d
p
k
+
1
,
j
(
i
<
=
k
<
j
)
)
(
s
i
!
=
s
j
)
dp_{i,j}=\left\{\begin{matrix}min(dp_{i,j-1},dp_{i+1,j})(s_i==s_j)\\min(dp_{i,k}+dp_{k+1,j}(i<=k<j))(s_i!=s_j)\end{matrix}\right.
dpi,j={min(dpi,j−1,dpi+1,j)(si==sj)min(dpi,k+dpk+1,j(i<=k<j))(si!=sj)
直接DP即可
code:
#include<cstdio>
#include<cstring>
using namespace std;
inline int min(int x,int y){return x<y?x:y;}
int n,dp[55][55];
char c[55];
int main()
{
scanf("%s",c+1),n=strlen(c+1),memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=n;++i)dp[i][i]=1;
for(int i=2;i<=n;++i)for(int l=1,r=i;r<=n;++l,++r)
{
if(c[l]==c[r])dp[l][r]=min(dp[l][r-1],dp[l+1][r]);
else for(int j=l+1;j<=r;++j)dp[l][r]=min(dp[l][r],dp[l][j-1]+dp[j][r]);
}
printf("%d",dp[1][n]);
return 0;
}