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; }