回文词——线性dp
#include<iostream> #include<cstdio> using namespace std; int n,f[5002][5002]; char str1[5002],str2[5002]; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>str1[i]; str2[n+1-i]=str1[i];//反过来赋值比较 } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(str1[i]==str2[j]) { f[i][j]=f[i-1][j-1]+1;//动态转移方程 } if(str1[i]!=str2[j]) { f[i][j]=max(f[i-1][j],f[i][j-1]);//动态转移方程 } } } cout<<n-f[n][n]; }
都明白回文词啥意思吧(要不然你就去百度),直接寻找正反两个字符串的最长子序列长度。拿总长度去减这个,输出。
定义两个数组:str1(直接读),str2(把s倒过来)
两个循环i(1-n),j(1-n)。
动态转移方程
0(i==0||j==0)(其实用上面的循环就可以省去了)
f[i][j] max(f[i-1][j],f[i][j-1])(si!=ti)(只跳过一个字母)
f[i-1][j-1]+1(si==ti)(长度+1)
QQ:2953174821