Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 58277 | Accepted: 20221 |
Descriptionhtml
Inputgit
Outputide
Sample Inputspa
5 Ab3bd
Sample Outputcode
2
Sourceorm
1.当S1==Sn时(字符串头字符和字符串尾部字符相等时),咱们的任务便转换为了将S2,S3,S4……S(n-1)变成回文,对吗?htm
2.当S1!=Sn时,咱们又有了两种决策blog
第一种决策:在字符串序列S1,S2,S3……Sn 的左边添加一个字符,咱们设这个字符为Si,使它等于Sn,这样咱们就将当前的任务转化为了将S1,S2,S3……S(n-1)变成回文字符串。ip
第二种决策:在字符串序列S1,S2,S3……Sn 的右边添加一个字符,咱们设这个字符为Sk,使他等于S1,这样咱们就将当前的任务转化为了将S2,S3,S4……Sn变成回文字符串。字符串
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; char s[5001]; short int dp[5001][5001]; int dfs(int l, int r) { //printf("%d %d\n", l, r); if(l >= r) return 0; int m = 999999; if(dp[l][r] != -1) return dp[l][r]; if(s[l] == s[r]) m = min(dfs(l+1, r-1), m); else { m = min(dfs(l+1,r)+1, m); m = min(dfs(l, r-1)+1,m); } dp[l][r] = m; return m; } int main() { int n; while(~scanf("%d", &n)) { memset(dp, -1, sizeof dp); scanf("%s", s); int len = strlen(s); int ans = dfs(0, len-1); printf("%d\n", ans); } return 0; }