1222. 密码脱落(区间dp)
注意:因为求的是最小,所以要先把dp置为无穷大
输入样例1:
ABCBA
输出样例1:
0
输入样例2:
ABDCDCBABC
输出样例2:
3
#include <bits/stdc++.h>
using namespace std;
int T,m,n;
const int N=1005;
int dp[N][N];//区间dp,ij之间的区间至少需要补多少字母
string str;
signed main(){
cin>>str;
n=str.size();
for (int i = 0 ; i < n; ++i)
for (int j = 0; j < n; ++j)
dp[i][j] = 2e9;
for(int len=1;len<=n;len++){
for(int i=0;i+len-1<n;i++){
int j=i+len-1;
if(str[i]==str[j]){
if(len<=2)dp[i][j]=0;
else dp[i][j]=min(dp[i][j],dp[i+1][j-1]);
}
else{
if(len==1)dp[i][j]=0;
else if(len==2)dp[i][j]=1;
else {
int tmp=min(dp[i+1][j]+1,dp[i][j-1]+1);
dp[i][j]=min(dp[i][j],tmp);
}
}
}
}
cout<<dp[0][n-1];
return 0;
}