hpu暑假训练【最长公共子序列&&回溯输出】
2017-08-08 17:12
316 查看
/* LCS 输入BDCABA ABCBDAB求最长公共子序列并输出这个子序列 子串:连续 子序列:可以不连续 dp[i][j]//第一个字符串在第i个字符前且第二个串在第j个字符前可构成的最长子序列的长度 dp[i][j] = 0 i=0 || j=0 dp[i-1][j-1]+1 str1[i]==str2[j] max(dp[i-1][j],dp[i][j-1]) str1[i]!=str2[j] */ #include<cstdio> #include<cstring> #include<stack> #include<algorithm> using namespace std; int main() { char str1[20]; char str2[20]; scanf ("%s %s",str1+1,str2+1); str1[0] = str2[0] = '0'; int l1 = strlen(str1)-1; int l2 = strlen(str2)-1; int dp[20][20] = {0};//0 i=0 || j=0 for (int i = 1 ; i <= l1 ; i++) { for (int j = 1 ; j <= l2 ; j++) { if (str1[i] == str2[j])//dp[i-1][j-1]+1 str1[i]==str2[j] dp[i][j] = dp[i-1][j-1] + 1; else dp[i][j] = max(dp[i-1][j],dp[i][j-1]);//max(dp[i-1][j],dp[i][j-1]) str1[i]!=str2[j] } } //回溯求LCS int pos1 = l1; int pos2 = l2; stack<char> S; while (pos1 > 0 && pos2 > 0) { if (str1[pos1] == str2[pos2]) { S.push(str1[pos1]); pos1--; pos2--; } else if (dp[pos1-1][pos2] > dp[pos1][pos2-1]) pos1--; else pos2--; } while (!S.empty()) { printf ("%c%c",S.top(),(S.size() == 1) ? '\n' : ' '); S.pop(); } printf ("%d\n",dp[l1][l2]); return 0; }
相关文章推荐
- hpu暑假训练C - Patrick and Shopping 【思维】&&【水题】
- hpu暑假训练C - Trailing Zeroes (III) 【二分法】&&【思维转化】
- hpu暑假训练F - Pasha and Stick 【思维】&&【水题】
- hpu暑假训练D - How Many Tables 【并查集】
- hpu暑假训练G - Bear and Three Balls
- hpu暑假训练【拓扑解题思路以及模板】
- hpu暑假训练【最短路思路以及模板】
- hpu暑假训练 B - Ignatius and the Princess IV 【sort】
- HPU1412-- QAQ & 君临天下 || 天行九歌(查询L到R天里的sum直接输出 sum[R] - sum[L-1] )
- (hdu step 8.1.6)士兵队列训练问题(数据结构,简单模拟——第一次每2个去掉1个,第二次每3个去掉1个.知道队伍中的人数<=3,输出剩下的人 )
- hpu暑假训练 G - 免费馅饼
- hpu暑假训练 E: YK的书架【思维】
- hpu暑假训练B - Pie 【二分法】
- hpu暑假训练G - New Year and Days【数学】
- hpu寒假训练D-Rikka with Chess 【思维&&找规律】
- hpu暑假训练I - Restaurant 【贪心】
- 1/26 训练五 深度优先搜索(dfs)E .(dfs 减枝! 注意回溯!给两个数ab,输出不超过b的最大a的重排) Permute Digits
- hpu暑假训练 C - Monkey and Banana【动态规划】
- hpu暑假训练 B - Bridging signals 【LIS】
- 腾讯 2017 暑假实习生编程题(一):给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。