HDOJ-1503 Advanced Fruits
来源:互联网 发布:中国出口贸易数据分析 编辑:程序博客网 时间:2024/05/17 23:33
这道题是最长公共子序列的变形。
用dp(i)(j)表示s1的前i个字符和s2的前j个字符,构成的shortest name .
状态转移方程:1.若s1(i) == s2(j),那么dp(i)(j) = dp(i-1)(j-1) + 1;
2.若s1(i) != s2(j), 那么dp(i)(j) = min(dp(i-1)(j), dp(i)(j-1)) + 1;
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;int dp[105][105];char s1[105], s2[105];void print(int n1, int n2, string &ans){ if(n1 == 0 && n2 == 0) return ; if(s1[n1] == s2[n2]) { ans += s1[n1]; print(n1-1, n2-1, ans); } else if(n1 >= 1 && dp[n1][n2] == dp[n1-1][n2] + 1) { ans += s1[n1]; print(n1-1, n2, ans); } else if(n2 >= 1 && dp[n1][n2] == dp[n1][n2-1] + 1) { ans += s2[n2]; print(n1, n2-1, ans); }}int main(){ // freopen("in.txt", "r", stdin); while(scanf("%s %s", s1+1, s2+1) == 2) { string ans; int n1 = strlen(s1+1), n2 = strlen(s2+1); for(int i = 1; i <= n2; i++) dp[0][i] = i; for(int i = 1; i <= n1; i++) dp[i][0] = i; for(int i = 1; i <= n1; i++) for(int j = 1; j <= n2; j++) { if(s1[i] == s2[j]) dp[i][j] = dp[i-1][j-1] + 1; else dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + 1; } print(n1, n2, ans); for(int i = ans.size()-1; i >= 0; i--) cout << ans[i]; cout << endl; } return 0;}
0 0
- HDOJ--1503 Advanced Fruits
- HDOJ-1503-Advanced Fruits
- HDOJ-1503 Advanced Fruits
- HDOJ 1503 Advanced Fruits
- HDOJ 1503 Advanced Fruits(LCS)
- hdoj-1503-Advanced Fruits【LCS】
- HDOJ 1503 Advanced Fruits(LCS+记录路径)
- hdoj 1503 Advanced Fruits (LCS 变形合并)
- HDOJ 题目1503 Advanced Fruits(LCS 递归,模板)
- hdoj 1503 Advanced Fruits 【最长公共子序列 变形】
- HDOJ 1503 Advanced Fruits (最长公共子序列 LCS)
- HDU 1503 Advanced Fruits
- HDU 1503 Advanced Fruits
- HDU 1503 - Advanced Fruits
- hdu 1503 Advanced Fruits
- 1503 Advanced Fruits
- hdu 1503 Advanced Fruits
- hdu 1503 Advanced Fruits
- 常见Oracle HINT的用法
- C++基础总结(2)---字符串
- Java多线程之Executor框架(2)
- Cocos2d-x的坐标系
- noip 2000年 乘积最大 - DP
- HDOJ-1503 Advanced Fruits
- adb 通信协议分析以及实现(一)
- 进程
- 深层神经网络
- 快速排序实现分析
- 一个优秀的Java程序员应该具备8种能力
- 异地机房之VPN/HTTP/HTTPS
- 个人总结(3.1)
- C-1-自加符-p9