HDU 1503 Advanced Fruits
2014-07-31 13:21
274 查看
求最短公共祖先,是最长公共子序列的变形。
在DP的同时记录下路径,然后递归回去输出即可。
如果碰到公共的,只输出一次。
以第一个样例为例:
代码君
在DP的同时记录下路径,然后递归回去输出即可。
如果碰到公共的,只输出一次。
以第一个样例为例:
//#define LOCAL #include <iostream> #include <cstdio> #include <cstring> using namespace std; char s1[205], s2[205]; int path[205][205], dp[205][205]; void Print(int i, int j) { if(i == 0 && j == 0) return; if(i == 0 && j != 0) { Print(i, j-1); printf("%c", s2[j-1]); } else if(i != 0 && j == 0) { Print(i-1, j); printf("%c", s1[i-1]); } else if(path[i][j] == 0) { Print(i-1, j-1); printf("%c", s1[i-1]); } else if(path[i][j] == 1) { Print(i-1, j); printf("%c", s1[i-1]); } else { Print(i, j-1); printf("%c", s2[j-1]); } } int main(void) { #ifdef LOCAL freopen("1503in.txt", "r", stdin); #endif while(cin >> s1 >> s2) { int len1, len2; len1 = strlen(s1); len2 = strlen(s2); int i, j; for(i = 1; i <= len1; ++i) for(j = 1; j <= len2; ++j) { if(s1[i-1] == s2[j-1]) { dp[i][j] = dp[i-1][j-1] + 1; path[i][j] = 0; } 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; } } Print(len1, len2); printf("\n"); } return 0; }
代码君
相关文章推荐
- hdu 1503 Advanced Fruits(最长公共子序列变形)
- HDU 1503 Advanced Fruits【LCS】
- hdu1503 Advanced Fruits
- HDU 1503 Advanced Fruits(LCS变形且输出解)
- hdu 1503 Advanced Fruits
- HDU 1503(Advanced Fruits)最长公共子序列+路径记录
- Advanced Fruits(HDU 1503 LCS变形)
- hdu 1503 Advanced Fruits(LCS)
- hdu 1503 Advanced Fruits
- HDU 1503 Advanced Fruits(LCS+输出路径)
- hdu 1503:Advanced Fruits(动态规划+路径输出)
- HDU-1503 Advanced Fruits(LCS)
- HDU 1503 Advanced Fruits(LCS+输出路径~)
- HDU 1503 Advanced Fruits
- hdu 1503 Advanced Fruits(最长公共子序列的应用)
- HDU 1503 Advanced Fruits(LCS)
- hdu 1503 Advanced Fruits
- HDU 1503 Advanced Fruits
- hdu1503 -Advanced Fruits
- HDU 1503 Advanced Fruits