hdu1513 Palindrome 动态规划
2015-05-16 14:50
232 查看
求让一个字符串变为回文串所需最少插入字符数
定义状态dp[i][j]
表示从左到右i个字符,从右到左j个字符,要让他们回文需要插入多少字符
显然,a[i]==a[j]时,dp[i][j]=dp[i−1][j−1]
a[i]!=a[j]时,就需要插入一个字符,因此dp[i][j]=min(dp[i−1][j],dp[i][j−1])+1
题目中字符串有5000长度,5000*5000的int数组,反正我是爆了……
无法把数组压缩成一维,因为你必须同时保留dp[i−1][j−1]和dp[i][j−1]来转移状态。
那就压缩成一维*2呗
对于题目最终的答案,应该是min(dp[i][n−i],dp[i][n−i−1]),因为插入完成后的字符串若是奇数个,中间那个字符是可以丢弃的
压缩了数组之后,答案尽量边dp边更新,不然容易粗事儿……
定义状态dp[i][j]
表示从左到右i个字符,从右到左j个字符,要让他们回文需要插入多少字符
显然,a[i]==a[j]时,dp[i][j]=dp[i−1][j−1]
a[i]!=a[j]时,就需要插入一个字符,因此dp[i][j]=min(dp[i−1][j],dp[i][j−1])+1
题目中字符串有5000长度,5000*5000的int数组,反正我是爆了……
无法把数组压缩成一维,因为你必须同时保留dp[i−1][j−1]和dp[i][j−1]来转移状态。
那就压缩成一维*2呗
对于题目最终的答案,应该是min(dp[i][n−i],dp[i][n−i−1]),因为插入完成后的字符串若是奇数个,中间那个字符是可以丢弃的
压缩了数组之后,答案尽量边dp边更新,不然容易粗事儿……
#include<iostream> #include<iomanip> #include<cstdio> #include<cstring> #include<sstream> #include<stack> #include<queue> #include<fstream> #include<algorithm> #include<map> #include<set> #include<vector> #include<cmath> #define CLR(x) memset(x,0,sizeof(x)) #define ll long long #define eps 1e-6 #define pow2(x) ((x)*(x)) #define forto(i,n) for(int i=0;i<n;i++) #define for1to(i,n) for(int i=1;i<=n;i++) #define VI vector<int> using namespace std; const double PI=acos(-1.0); #define INF 0x3fffffff ///INT_MAX一半防止上溢 #define NINF 0xbfffffff using namespace std; char A[5555]; int dp[2][5555]; int main() { cin.sync_with_stdio(false); #ifndef ONLINE_JUDGE freopen("test.txt","r",stdin); #endif int n; while (cin>>n) { CLR(dp); cin>>A+1; for (int i=0;i<=n+1;i++) dp[0][i]=i; int result(INF); for (int i=1;i<n;i++) { dp[i&1][0]=i; for (int j=1;i+j<=n;j++) { if (A[i]==A[n+1-j]) dp[i&1][j]=dp[(i-1)&1][j-1]; else dp[i&1][j]=min(dp[(i-1)&1][j],dp[i&1][j-1])+1; if (i+j==n||i+j==n-1) result=min(result,dp[i&1][j]); } } cout<<result<<endl; } return 0; }
相关文章推荐
- hdu1513 Palindrome 动态规划
- poj 1159 Palindrome -- 回文串,动态规划
- poj1159 palindrome(动态规划+滚动数组)
- HDU1513:Palindrome 【LCS】
- HDU1513:Palindrome
- POJ 1159 Palindrome (动态规划)
- POJ1159 Palindrome 【动态规划】
- HDU1513:Palindrome
- [动态规划]Pku1159--Palindrome
- HDU1513 && POJ1159:Palindrome(LCS)
- hdu1513 Palindrome
- hdu1513——Palindrome
- hdu1513 Palindrome
- LeetCode 之 Palindrome Partitioning II(动态规划)
- UVA 10739 String to Palindrome(动态规划 回文)
- POJ-3280 Cheapest Palindrome 动态规划求回文串
- Poj1159 Palindrome(动态规划DP求最大公共子序列LCS)
- Palindrome Partitioning II(找给定字符串分割次数获取回文字串, 动态规划)
- hdu 1159 Palindrome(回文串) 动态规划
- Palindrome Partitioning I 和II的代码和理解(动态规划思想)