您的位置:首页 > 其它

SRM 615 D2L3:MergeStrings,dp

2014-04-05 11:33 435 查看
题目:http://community.topcoder.com/stat?c=problem_statement&pm=13095

一个比较简单的dp,可惜昨晚比赛没做出来,有点像找最大公共子序列。

#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <iostream>
#include <sstream>
#include <iomanip>

#include <bitset>
#include <string>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <set>
#include <map>

#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <cstring>
#include <ctime>
#include <climits>
using namespace std;

#define CHECKTIME() printf("%.2lf\n", (double)clock() / CLOCKS_PER_SEC)
typedef pair<int, int> pii;
typedef long long llong;
typedef pair<llong, llong> pll;
#define mkp make_pair

/*************** Program Begin **********************/
const int MAX_N = 51;
string dp[MAX_N][MAX_N][MAX_N];
class MergeStrings {
public:
string S, A, B;
string rec(int cur, int a, int b)
{
string & res = dp[cur][a][b];
if (res != "#") {
return res;
}

// base case
if (cur == S.size()) {
res = "";
return "";
}

string tmp;
tmp = (char)('Z' + 1);
res = tmp;
// select A
if ( (a < A.size()) && (S[cur] == A[a] || '?' == S[cur]) ) {
string rem = rec(cur + 1, a + 1, b);
if (rem != "*") {
res = min(res, A[a] + rem);
}
}

// select B
if ( (b < B.size() && (S[cur] == B[b] || '?' == S[cur]) ) ) {
string rem = rec(cur + 1, a, b + 1);
if (rem != "*") {
res = min(res, B[b] + rem);
}
}
if (res == tmp) {
res = "*";
}
return res;
}
string getmin(string S, string A, string B) {
this->S = S;
this->A = A;
this->B = B;
for (int i = 0; i < MAX_N; i++) {
for (int j = 0; j < MAX_N; j++) {
for (int k = 0; k < MAX_N; k++) {
dp[i][j][k] = "#";
}
}
}
string res = rec(0, 0, 0);
return (res == "*" ? "" : res);
}

};

/************** Program End ************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: