P1435 回文字串

题解:洛谷P1435 回文字串(dp)_洛谷表示前洛谷P1435 回文字串(dp)_洛谷_02个字符与后洛谷P1435 回文字串(dp)_dp_03个字符构成回文串需要插入的最少字符数。
则有洛谷P1435 回文字串(dp)_#include_04
至于边界就是洛谷P1435 回文字串(dp)_洛谷_05。前洛谷P1435 回文字串(dp)_洛谷_02个字符和后洛谷P1435 回文字串(dp)_#ifndef_07个至少需要插入洛谷P1435 回文字串(dp)_洛谷_02个字符,后洛谷P1435 回文字串(dp)_dp_03个字符和前洛谷P1435 回文字串(dp)_#ifndef_07个字符至少需要插入洛谷P1435 回文字串(dp)_dp_03个字符。

代码

#include<bits/stdc++.h>

using namespace std;
int dp[1010][1010];
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.in","r",stdin);
#endif
string s;
cin>>s;
int n = s.length();
for(int i = 1; i <= n; ++i) {
dp[i][0] = dp[0][i] = i;
}
for(int i = 1; i <= n; ++i) {
for(int j = 1; i + j <= n; ++j) {
if(s[i - 1] == s[n - j]) {
dp[i][j] = dp[i - 1][j - 1];
}else{
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + 1;
}
}
}
int ans = 1e9;
for(int i = 0; i < n; ++i) {
ans = min(ans,min(dp[i][n - i],dp[i][n - i - 1]));
}
cout<<ans<<endl;
return 0;
}