poj 1159
来源:互联网 发布:ubuntu 安装sqlserver 编辑:程序博客网 时间:2024/05/29 13:47
一种解法是求原序和逆序的最长公共子序列;
第二次方法是dp;
都用的滚动数组,也可以用short减小内存;
第一次知道怎么算内存大小了,哈哈
//5000 * 5000的int ——> 5000 * 5000 * 4 bytes 约(/ (2 ^ 20))等于5 * 5 * 4 MB = 100 MB > 65536 K = 64 M,会MLE的。。
第二种思路
1.当S1==Sn时(字符串头字符和字符串尾部字符相等时),我们的任务便转换为了将S2,S3,S4……S(n-1)变成回文,对吗?
2.当S1!=Sn时,我们又有了两种决策
第一种决策:在字符串序列S1,S2,S3……Sn
第二种决策:在字符串序列S1,S2,S3……Sn
第一种
代码如下
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std; int main(){char a[5005],b[5005];int n,dp[2][5005];scanf("%d",&n);scanf("%s",a);for(int i=n-1;i>=0;i--) b[n-1-i]=a[i];memset(dp,0,sizeof(dp));for(int i=0;i<n;i++)for(int j=0;j<n;j++){if(a[i]==b[j]){dp[(i+1)%2][j+1]=dp[i%2][j]+1;}else{dp[(i+1)%2][j+1]=max(dp[i%2][j+1],dp[(i+1)%2][j]);}}printf("%d\n",n-dp[n%2][n]); }
第二种
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;int main(){int n,dp[2][5005];char a[5005];memset(dp,0,sizeof(dp));scanf("%d",&n);scanf("%s",a);for(int i=n-2;i>=0;i--)for(int j=i;j<n;j++){if(a[i]==a[j]) dp[i%2][j]=dp[(i+1)%2][j-1];else{dp[i%2][j]=min(dp[(i+1)%2][j],dp[i%2][j-1])+1;} }printf("%d\n",dp[0][n-1]); }
阅读全文
0 0
- POJ 1159
- poj 1159
- poj 1159
- POJ 1159
- poj 1159
- poj 1159
- poj 1159
- poj-1159
- POJ 1159
- POJ 1159
- POJ 1159
- POJ-1159
- POJ 1159
- poj 1159
- poj 1159 Palindrome LCS
- poj 1159 Palindrome LCS
- POJ 1159解题报告
- poj 1159 Palindrome
- JAVA-Struts2防止表单重复提交
- MYSQL性能优化
- 【备忘】2017最新传智播客黑马java 32期基础就业班视频教程
- mongoDB 使用 mongoVue
- 压缩在hadoop中的应用
- poj 1159
- hdu 5000 思维+dp
- codility CountNonDivisible
- 14. Longest Common Prefix
- MediaPlay错误:error(1,-19)
- 31.多线程
- Java学习笔记-匿名内部类
- 16位汇编第八讲指令第四讲
- 【学习摘记】马士兵Servlet&JSP_课时5_测试Servlet生命周期的4个函数先后调用的顺序