题解:
比较水的区间dp。
我们令dp[i][j]表示i-j这段区间最少涂色次数
分两种情况
1:
s[i],s[j]
s
[
i
]
,
s
[
j
]
一样
f[i][j]=min(f[i+1][j],f[i][j−1]);
f
[
i
]
[
j
]
=
m
i
n
(
f
[
i
+
1
]
[
j
]
,
f
[
i
]
[
j
−
1
]
)
;
f[i][j]=min(f[i][j],f[i+1][j−1]+1);
f
[
i
]
[
j
]
=
m
i
n
(
f
[
i
]
[
j
]
,
f
[
i
+
1
]
[
j
−
1
]
+
1
)
;
2:
s[i],s[j]
s
[
i
]
,
s
[
j
]
不一样
f[i][j]=min(f[i][k]+f[k+1][j],f[i][j])
f
[
i
]
[
j
]
=
m
i
n
(
f
[
i
]
[
k
]
+
f
[
k
+
1
]
[
j
]
,
f
[
i
]
[
j
]
)
应该非常好理解。
Code:
C
o
d
e
:
#include<bits/stdc++.h>
#define N 55
using namespace std;
char s[N];int dp[N][N];
int main()
{
scanf("%s",s);
int len=strlen(s);
for(int i=0;i<len;i++)dp[i][i]=1;
for(int j=1;j<len;j++)
for(int i=0;i<len-j;i++)
{
dp[i][i+j]=1000000000;
for(int k=i;k<=i+j-1;k++)
dp[i][i+j]=min(dp[i][i+j],dp[i][k]+dp[k+1][i+j]-int(s[i]==s[i+j]));
}
printf("%d",dp[0][len-1]);
return 0;
}