hdu 1159, LCS, dynamic programming, recursive backtrack vs iterative backtrack vs incremental, C++
来源:互联网 发布:网络话飞机场什么意思 编辑:程序博客网 时间:2024/04/27 22:18
thanks prof. Abhiram Ranade for his vedio on Longest Common Subsequence ‘s back track search view in lecture 19, nice explanation indeed.
// back track, recursive, 390 ms, O(m*n) memory
#include <cstdio>#include <vector>#include <string>#include <iostream>#include <algorithm>#define MAXSIZE 1001using std::string;char *p1, *p2;int M, N;int table[MAXSIZE][MAXSIZE];int solveLCSlength(int i, int j) { if(table[i][j]>=0) return table[i][j]; int k; for(k=j;k<N && p2[k]!=p1[i];++k) {} if(k!=N) table[i][j]=std::max(solveLCSlength(i+1,j),1+solveLCSlength(i+1,k+1)); else table[i][j]=solveLCSlength(i+1,j); return table[i][j];}int LCSlength(string &s1, string &s2) { p1=&s1[0], p2=&s2[0], M=s1.size(), N=s2.size(); for(int i=0;i<M;++i) { for(int j=0;j<N;++j) { table[i][j]=-1; } table[i][N]=0; } for(int j=0;j<=N;++j) { table[M][j]=0; } return solveLCSlength(0,0);}int main() { string s1, s2; while(std::cin >> s1 >> s2) { printf("%d\n",LCSlength(s1,s2)); } return 0;}
// turn recursive backtrack version to iterative and reduce memory cost to O(m+n) , 312ms
#include <cstdio>#include <cstring>#include <algorithm>#define MAXSIZE 1001int LCSlength(char *s1, char *s2) { static int table[MAXSIZE<<1]; int len1,len2, i,j,k, *prev,*curr; len1=strlen(s1), len2=strlen(s2); prev=&table[0], curr=&table[len2+1]; for(i=0;i<=len2;++i) prev[i]=0; curr[len2]=0; for(i=len1-1;i>=0;--i) { char tmp=s1[i]; for(j=len2-1;j>=0;--j) { for(k=j;k<len2 && tmp!=s2[k];++k) {} curr[j]=prev[j]; if(k!=len2 && curr[j]==prev[k+1]) ++curr[j]; } std::swap(prev,curr); } return prev[0];}int main() { char s1[MAXSIZE], s2[MAXSIZE]; while(scanf("%s%s",s1,s2)==2) { printf("%d\n",LCSlength(s1,s2)); } return 0;}
// incremental, 31ms, O(m+n) memory
#include <cstdio>#include <algorithm>#define MAXSIZE 1001int main() { char s1[MAXSIZE], s2[MAXSIZE]; int table[MAXSIZE<<1], *prev, *curr; int len1,len2, i,j; while(scanf("%s%s",s1,s2)==2) { len1=strlen(s1), len2=strlen(s2); prev=table, curr=&table[len2+1]; for(i=0;i<=len2+1;++i) prev[i]=0; for(i=1;i<=len1;++i) { for(j=1;j<=len2;++j) { if(s1[i-1]==s2[j-1]) curr[j]=1+prev[j-1]; else curr[j]=prev[j]>curr[j-1]?prev[j]:curr[j-1]; } std::swap(curr,prev); } printf("%d\n",prev[len2]); } return 0;}
0 0
- hdu 1159, LCS, dynamic programming, recursive backtrack vs iterative backtrack vs incremental, C++
- BackTrack
- backtrack
- Dynamic Programming 学习笔记(二) LIS vs LCS
- hdu 1503, LCS variants, find a LCS, not just the length, backtrack to find LCS, no extra markup
- Recursive backtrack & Non-recursive backtrack & Subset Tree & Permutation Tree 递归回溯与非递归回溯 排列树与子集树
- BackTrack安装
- BackTrack简介
- Python vs C#, Dynamic vs Managed Compiled
- FULL VS INCREMENTAL OTA
- Incremental Differential vs. Incremental Cumulative Backups
- Backtrack 4: Crack WPA2
- BackTrack ---装载问题
- BackTrack-R2发布
- BackTrack(bt5) GNOME汉化
- backtrack常用渗透命令
- BackTrack 5 bashrc
- backtrack常用渗透命令
- reveals her inspira
- Android 开机启动, service 自动运行。
- 300+ 优秀常用wordpress插件推荐
- 在桌面上显示“这台电脑”Windows Server 2012 R2
- 常用传感器协议1:CJ/T-188 水表协议解析1
- hdu 1159, LCS, dynamic programming, recursive backtrack vs iterative backtrack vs incremental, C++
- openfire每次启动都要在网页初始化设置的解决方法
- Robot Framework自动化测试(一)---第一个脚本
- Robot Framework自动化测试(二)---元素定位
- Robot Framework自动化测试(三)---Selenium API
- Robot Framework自动化测试(四)--- 分层思想
- 关于心理学方面的一点看法
- Robot Framework自动化测试(五)--- 开发系统关键字
- Robot Framework自动化测试 ---文档分享