!HDU 1513 Palindrome--dp--(最长公共子序列模型)
2015-06-21 20:16
381 查看
题意:给定一个字符序列,求最少添加多少个字符能让它变成对称序列
分析:这题的做法竟然是把序列颠倒之后求最长公共子序列,然后n-dp
就是答案。记住这种做法。
在这里再说一次最长公共子序列的做法:dp[i][j]表示序列1的前i个字符和序列2的前j个字符比较时的最长公共子序列的长度,状态转移公式:1.当a[i]==b[j]时,dp[i][j]=dp[i-1][j-1]+1;2.否则,dp[i][j]=max(dp[i-1][j],dp[i][j-1])
代码:
分析:这题的做法竟然是把序列颠倒之后求最长公共子序列,然后n-dp
就是答案。记住这种做法。
在这里再说一次最长公共子序列的做法:dp[i][j]表示序列1的前i个字符和序列2的前j个字符比较时的最长公共子序列的长度,状态转移公式:1.当a[i]==b[j]时,dp[i][j]=dp[i-1][j-1]+1;2.否则,dp[i][j]=max(dp[i-1][j],dp[i][j-1])
代码:
#include<iostream> using namespace std; int n; char a[5005],b[5005]; int dp[2][5005]; int max(int i,int j) { return i>j?i:j; } void DP() { for(int i=0;i<=n;i++) dp[i%2][0]=0; for(int i=0;i<=n;i++) dp[0][i]=0; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(a[i-1]==b[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]); } } } int main() { while(cin>>n){ cin>>a; for(int i=n-1;i>=0;i--) b[n-i-1]=a[i]; DP(); cout<<n-dp[n%2] <<endl; } }
相关文章推荐
- BZOJ 3153 Sone1
- Exponential families
- IO-常用流
- 教你使用破解无线路由器笔记本password
- 在centos下安装mysql
- C++文件的打开与关闭
- login shell 和 nologin shell
- 报错:this class is not key value coding-compliant for the key tableview
- 在数组中,求和为定值的元素组合
- 牛腩新闻系统(三)——DAL层的开发之后
- 使用CNN(convolutional neural nets)关键的一点是检测到的面部教程(四):学习率,学习潜能,dropout
- BZOJ[4127] Abs
- Chromium自动为Debian用户下载了可监听语音的二进制文件
- 多线程 编写多线程的两种方式
- 个人作业--课本最后一章及博客读后感
- 归并排序和快速排序的算法实现
- 个人作业--课本最后一章及博客读后感
- CDOJ 1088 王之迷宫 BFS
- 《心理学与生活》发展与教育(上)
- UIView frame, bounds and center