标签:
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 59029 | Accepted: 20505 |
Description
Input
Output
Sample Input
5 Ab3bd
Sample Output
2
题意是给你一个字符串,让你最少添加多少个字符使得字符串为一个回文串,参考了网上大神们的想法 首先把原始的串反转,然后求这两个串的最长公共子序列,
需要添加的字符=字符串的长度-公共字符串
感觉很好理解,然后写一下最长公共子序列就好了,简单的dp啊
还有中间需要注意的地方,由于题目要求的内存为65536K,要是使用int保存
dp[5005][5005],毫无疑问内存超限了,好多大神写的是滚动数组。本弱弱利用short来存储dp数组,险过啊!!!由于int保存为4个字节,而short只用2个字节来保存,你懂得。
//神奇的short,不会超内存, #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; short dp[5005][5005]; char s1[5005],s2[5005]; int main(){ int n,i,j; int ans; while(~scanf("%d",&n)){ scanf("%s",s1); int l = strlen(s1); for(i=0;i<l;i++){ s2[l-i-1]=s1[i]; } s2[l] = '\0'; memset(dp,0,sizeof(dp)); for(i=1;i<=l;i++){ for(j=1;j<=l;j++){ if(s1[i-1]==s2[j-1]){ dp[i][j]=dp[i-1][j-1]+1; } else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } printf("%d\n",l-dp[l][l]); } return 0; }
poj 1159 Palindrome -- 回文串,动态规划
标签:
原文地址:http://blog.csdn.net/qq_27717967/article/details/51361322