POJ1159 Palindrome(dp)
2013-07-11 19:48
316 查看
题目链接。
分析:
感叹算法的力量。
方法一:
设 dp[i][j] 为字符串 s, 从 i 到 j 需要添加的最少字符数。
那么如果 s[i] == s[j], dp[i][j] = dp[i+1][j-1]. 如果 s[i] != s[j], dp[i][j] = min(dp[i+1][j], dp[i][j-1]) + 1.
View Code
分析:
感叹算法的力量。
方法一:
设 dp[i][j] 为字符串 s, 从 i 到 j 需要添加的最少字符数。
那么如果 s[i] == s[j], dp[i][j] = dp[i+1][j-1]. 如果 s[i] != s[j], dp[i][j] = min(dp[i+1][j], dp[i][j-1]) + 1.
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <map> using namespace std; const int maxn = 5000+10; int dp[2][maxn]; char s1[maxn], s2[maxn]; int main(){ int n; while(scanf("%d", &n) == 1) { scanf("%s", s1); memset(dp[0], 0, sizeof(dp[0])); for(int i=0; i<n; i++) { s2[n-i-1] = s1[i]; } s2 = '\0'; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { if(s1[i-1] == s2[j-1]) dp[i%2][j] = dp[(i-1)%2][j-1] + 1; else dp[i%2][j] = max(dp[(i-1)%2][j], dp[i%2][j-1]); } } printf("%d\n", n-dp[n%2] ); } return 0; }
View Code
相关文章推荐
- poj 1159 Palindrome(lcs类似dp)
- [POJ 1159]Palindrome[DP]
- 区间DP基础篇之 POJ1159——Palindrome
- POJ-1159-Palindrome -dp
- POJ1159 - Palindrome(区间DP)
- POJ-1159-Palindrome(简单dp)
- Poj1159 Palindrome(动态规划DP求最大公共子序列LCS)
- POJ-1159 Palindrome (dp+滚动数组节省内存)
- POJ 1159-Palindrome(dp_回文串+滚动数组)
- dp中滚动数组的应用:01背包、POJ 1159 Palindrome、多段图路径问题
- POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)
- Poj1159 Palindrome(动态规划DP求最大公共子序列LCS)
- poj1159--Palindrome(dp:最长公共子序列变形 + 滚动数组)
- poj 1159 Palindrome ( dp 滚动数组 )
- POJ 1159 Palindrome(区间dp)
- Palindrome - POJ 1159 dp
- poj1159——Palindrome(组成回文串的最少字符数,dp)
- 【转】POJ 1159 Palindrome【经典的DP回文问题】
- poj1159--Palindrome(dp:最长公共子序列变形 + 滚动数组)
- POJ 1159 Palindrome(基础DP)