假设你有一条长度为5的木版,初始时没有涂过任何颜色。你希望把它的5个单位长度分别涂上红、绿、蓝、绿、红色,用一个长度为5的字符串表示这个目标:RGBGR。 每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色。例如第一次把木版涂成RRRRR,第二次涂成RGGGR,第三次涂成RGBGR,达到目标。 用尽量少的涂色次数达到目标。
题解:区间DP
感觉gyr神犇讲得非常透彻。
考虑
f[l][r]
新加入的
l
对答案的影响:
1.单独染色:
2.合并染色:
f[l][r]=min{f[l+1][i]+f[i+1][r]}(str[l]==str[i+1])
即考虑先染 l~i+1 ,再染 l+1~i ,再染 i+1~r ,因为 i+1 和 l <script type="math/tex" id="MathJax-Element-532">l</script>颜色相同,所以同时染就行了.
#include<bits/stdc++.h>
using namespace std;
string x;
int f[105][105];
inline int Dp(int l,int r){
if(l>r)return 0;
if(f[l][r]!=-1)return f[l][r];
if(l==r)return f[l][r]=1;
f[l][r]=0x3fffffff;
for(int i=l+1;i<=r;i++){
if(x[l]==x[i])f[l][r]=min(f[l][r],Dp(l+1,i-1)+Dp(i,r));
}
f[l][r]=min(f[l][r],1+Dp(l+1,r));
return f[l][r];
}
int main(){
memset(f,-1,sizeof(f));
cin>>x;
cout<<Dp(0,x.length()-1);
}