poj1159 Palindrome 区间DP
2013-08-12 13:21
344 查看
题目链接:http://poj.org/problem?id=1159
思路1:
区间DP思想:
定义dp[i][j]表示从区间(i,j)之间需要增加的字符的最少数量,那么如果s[i]==s[j],那么dp[i][j]=dp[i-1][j-1]
否则dp[i][j]=min(dp[i+1][j]+1,dp[i][j-1]+1);
如果直接DP,需要开5001*5001的数组,用int会超内存
用short int 能过;
代码如下:
View Code
思路1:
区间DP思想:
定义dp[i][j]表示从区间(i,j)之间需要增加的字符的最少数量,那么如果s[i]==s[j],那么dp[i][j]=dp[i-1][j-1]
否则dp[i][j]=min(dp[i+1][j]+1,dp[i][j-1]+1);
如果直接DP,需要开5001*5001的数组,用int会超内存
用short int 能过;
代码如下:
#include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> using namespace std; int dp[2][5010]; char s1[5010]; char s2[5010]; int main() { int n; while(scanf("%d",&n)!=EOF) { memset(dp,0,sizeof(dp)); cin>>s1; int j=0; for(int i=n-1; i >= 0; i--) s2[j++] = s1[i]; for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(s1[i]==s2[j]) dp[(i+1)%2][j+1]=dp[i%2][j]+1; else dp[(i+1)%2][j+1]=max(dp[(i+1)%2][j],dp[i%2][j+1]); cout<<n-dp[n%2] <<endl; } return 0; }
View Code
相关文章推荐
- HDU Palindrome subsequence(区间DP)
- POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)
- HDU4632:Palindrome subsequence(区间DP)
- UVa 10739 String to Palindrome(经典回文串区间DP)
- HDU Palindrome subsequence(区间DP)
- Cheapest Palindrome (poj 3280 区间DP)
- POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)
- 区间DP Cheapest Palindrome
- Palindrome subsequence(区间dp)
- UVA 10739 String to Palindrome (区间dp)
- CF 335B - Palindrome 区间DP
- [poj3280][区间dp]Cheapest Palindrome
- C - Palindrome——区间DP,巧妙的利用滚动数组
- HDU4632:Palindrome subsequence(区间DP)
- Cheapest Palindrome POJ - 3280 (区间DP)
- Poj1159 Palindrome 【简单DP】(LCS)
- [poj3280]Cheapest Palindrome_区间dp
- POJ3280-区间dp或递推-Cheapest Palindrome
- uva 10739 - String to Palindrome(区间dp)
- POJ1159:Palindrome【dp】