Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 58168 | Accepted: 20180 |
Description
Input
Output
Sample Input
5 Ab3bd
Sample Output
2
最少插入多少个字符使得原来的字符串变成回文串DP[i][j]表示长度为i的第j个字符开头的字串需要插入的个数
状态转移方程:(字符串下表以1开始)
dp[i][j]=dp[i-2][j+1] 如果s[i+j-1]==s[j]
dp[i][j]=min(dp[i-1][j-1],dp[i-1][j+1])+1 如果不等
1 #include <cstring> 2 #include <algorithm> 3 #include <cstdio> 4 #include <iostream> 5 using namespace std; 6 #define Max 5001 7 short int dp[Max][Max]; 8 char s[Max]; 9 int main() 10 { 11 int len; 12 int i,j; 13 freopen("in.txt","r",stdin); 14 scanf("%d",&len); 15 scanf("%s",s); 16 memset(dp,0,sizeof(dp)); 17 for(i=2;i<=len;i++) 18 { 19 for(j=0;j<=len-i;j++) 20 { 21 22 if(s[i+j-1]==s[j]) 23 dp[i][j]=dp[i-2][j+1]; 24 else 25 dp[i][j]=min(dp[i-1][j],dp[i-1][j+1])+1; 26 } 27 } 28 printf("%d\n",dp[len][0]); 29 return 0; 30 }
原文:http://www.cnblogs.com/a1225234/p/5243228.html