hdu 1503 Advanced Fruits
2016-08-03 15:44
435 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1503
思路:这是一道最长公共子序列的题目,当然还需要记录路径。把两个字符串的最长公共字串记录下来,在递归回溯输出的时候,要是两个字符是公共子串,就只输出一次,要不是,就分别把位于相同位置的两个字符串的字符输出.......
思路:这是一道最长公共子序列的题目,当然还需要记录路径。把两个字符串的最长公共字串记录下来,在递归回溯输出的时候,要是两个字符是公共子串,就只输出一次,要不是,就分别把位于相同位置的两个字符串的字符输出.......
#include<cstdio> #include<iostream> #include<algorithm> #include<math.h> #include<string.h> #include<vector> #include<queue> #include<iterator> #include<vector> #include<set> #define dinf 0x3f3f3f3f typedef long long ll; using namespace std; int dp[1005][1005],path[1005][1005],flag[1005]; int main() { int len1,len2; string str1,str2; while(cin>>str1>>str2) { len1=str1.length(); len2=str2.length(); memset(dp,0,sizeof(dp)); memset(path,0,sizeof(path)); memset(flag,-1,sizeof(flag)); for(int i=1;i<=len1;i++) for(int j=1;j<=len2;j++) { if(str1[i-1]==str2[j-1]) dp[i][j]=dp[i-1][j-1]+1; else if(dp[i-1][j]>dp[i][j-1]) { dp[i][j]=dp[i-1][j]; path[i][j]=1; } else { dp[i][j]=dp[i][j-1]; path[i][j]=2; } } for(int i=len1,j=len2;i>=1&&j>=1;) { if(path[i][j]==0) { i--; j--; flag[i]=j; } else if(path[i][j]==1) i--; else j--; } int k=0; for(int i=0;i<len1;i++) { if(flag[i]==-1) cout<<str1[i]; else { for(int j=k;j<=flag[i];j++) cout<<str2[j]; k=flag[i]+1; } } for(int i=k;i<len2;i++) cout<<str2[i]; cout<<endl; } return 0; }
相关文章推荐
- hdu1503 -Advanced Fruits
- hdu1503 Advanced Fruits
- HDU 1503 Advanced Fruits
- hdu 1503 Advanced Fruits(最长公共子序列的应用)
- HDU 1503(Advanced Fruits)最长公共子序列+路径记录
- 【DP|LCS+输出路径】HDU-1503 Advanced Fruits
- HDU 1503 Advanced Fruits(LCS变形且输出解)
- hdu 1503 advanced fruits
- HDU 1503 Advanced Fruits
- 最长公共子序列(加强版) Hdu 1503 Advanced Fruits
- HDU:1503 Advanced Fruits(LCS+标记路径+输出)
- hdu 1503 Advanced Fruits(LCS)
- HDU 1503 Advanced Fruits(LCS+记录路径)
- hdu 1503 Advanced Fruits(最长公共子序列)
- HDU 1503-Advanced Fruits(动态规划,LCS)
- hdu 1503 Advanced Fruits(最长公共子序列变形)
- HDU 1503 Advanced Fruits
- HDU-1503 Advanced Fruits
- HDU 1503 Advanced Fruits(还原最长公共子序列、记录路径)
- HDU-1503 Advanced Fruits(LCS)