题意
给你一个字符串,每次涂色只能将一段区间的颜色改为一种,问将一个空白的版涂成目标串最少需要几次。
题解
很明显是区间DP啊,
fi,j
f
i
,
j
表示i到j这段区间涂成目标串最小代价。
那么有两种情况。
1、st[i]==st[j]
那么转移
fi,j=min(fi+1,j−1+1)
f
i
,
j
=
m
i
n
(
f
i
+
1
,
j
−
1
+
1
)
fi,j=min(fi+1,j,fi,j−1)
f
i
,
j
=
m
i
n
(
f
i
+
1
,
j
,
f
i
,
j
−
1
)
2、st[i]!=st[j]
fi,j=min(fi,k+fk+1,j)
f
i
,
j
=
m
i
n
(
f
i
,
k
+
f
k
+
1
,
j
)
应该挺简单的吧qwq?
//Suplex
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int inf=1e9;
int n,f[100][100];
char st[1000];
int main()
{
scanf("%s",st+1);
n=strlen(st+1);
for(int i=1;i<=n;i++) f[i][i]=1;
for(int p=2;p<=n;p++)
for(int i=1;i<=n-p+1;i++){
int j=i+p-1;
f[i][j]=inf;
if(st[i]==st[j]){
f[i][j]=min(f[i+1][j],f[i][j-1]);
f[i][j]=min(f[i][j],f[i+1][j-1]+1);
}else{
for(int k=i;k<j;k++)
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
}
}
printf("%d\n",f[1][n]);
return 0;
}