DP练习1题解E
本题首A学长指出是最长字符子序列的问题
和最长字串子串很像 但是不相同
(比如bebbebeb 两者区别是连续不连续)(
一开始以为是要连续还以为他说错了T_T)
emmm 我没想到 我想到是裸DP
dp[i][j]表示从i到j需要补充的字符数
每次状态转移从d[i-1][j-1](头尾相同的话)
和d[i+1][j]+1 d[i][j-1]+1中选最小
对长度为1的预处理
然后长度为2到n开始DP
代码如下
#include<iostream>
#include<cstring>
char ch[5001];
int a[5001][5001];
using namespace std;
int main()
{
int i,n,k,j;
memset(a,0,sizeof(a));
cin>>n;
getchar();
for (i=1;i<=n;i++)
{
cin>>ch[i];
a[i][i]=0;
}
getchar();
for (k=2;k<=n;k++)
for (i=1;i<=n-k+1;i++)
{
j=i+k-1;
if (ch[i]==ch[j]) a[i][j]=a[i+1][j-1];
else a[i][j]=a[i+1][j]+1;
if (a[i][j-1]+1<a[i][j]) a[i][j]=a[i][j-1]+1;
}
cout<<a[1][n]<<endl;
return 0;
}
以上