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 ************************/
一个比较简单的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 ************************/
相关文章推荐
- SRM 612 D2L3:PowersOfTwo,dp
- SRM 591 D2L3:YetAnotherTwoTeamsProblem,dp
- SRM 620 D2L3: RandomGraph, dp
- SRM 610 D2L3:MiningGoldEasy,dp
- SRM 604 D2L3:FoxConnection2,dp
- SRM 615 D1L3: AlternativePiles, dp
- SRM 620 D2L3: RandomGraph, dp
- SRM 627 D2L3: BubbleSortWithReversals, dp, 冒泡排序
- SRM 609 D2L3: VocaloidsAndSongs,dp
- SRM 602 D2L3:BlackBoxDiv2,dp
- SRM 599 D2L3: SimilarNames2,dp
- SRM 572 D2L3:DistinctRemainders,dp,math
- CF 615 B Longtail Hedgehog(dfs/dp)
- SRM 509 DIV1 500pt(DP)
- [DP] Topcoder SRM 552 DIV1 Hard. HolyNumbers
- [树形DP] SRM 598 Div1 Hard TPS
- TopCoder SRM 653 Div2 Problem 500 - RockPaperScissorsMagicEasy (DP)
- 【DP】SRM552 PointErasing
- srm 306 div2 1000 (字符串dp,进阶)
- SRM 617 D2L3: MyVeryLongCake, Math