SRM 607 L2 D2:PalindromicSubstringsDiv2,DP
2014-02-08 16:42
387 查看
题目:http://community.topcoder.com/stat?c=problem_statement&pm=12967
暴力法会超时,dp[i][j] 表示 子串 [i...j] 是否为回文串。
代码:
#include <algorithm>
#include <iostream>
#include <sstream>
#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>
using namespace std;
#define CHECKTIME() printf("%.2lf\n", (double)clock() / CLOCKS_PER_SEC)
/*************** Program Begin **********************/
bool dp[5000][5001];
class PalindromicSubstringsDiv2 {
public:
int count(vector <string> S1, vector <string> S2) {
memset(dp, 0, sizeof(dp));
int res = 0;
string S;
for (int i = 0; i < S1.size(); i++) {
S += S1[i];
}
for (int i = 0; i < S2.size(); i++) {
S += S2[i];
}
int N = S.size();
for (int i = 0; i < N; i++) {
dp[i][i] = true;
++res;
}
for (int len = 2; len <= N; len++) {
for (int i = 0; i <= N - len; i++) {
if (S[i] == S[i + len - 1]) {
if (len == 2 || dp[i+1][i + len - 2] == true) {
dp[i][i+ len - 1] = true;
++res;
}
}
}
}
return res;
}
};
/************** Program End ************************/
暴力法会超时,dp[i][j] 表示 子串 [i...j] 是否为回文串。
代码:
#include <algorithm>
#include <iostream>
#include <sstream>
#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>
using namespace std;
#define CHECKTIME() printf("%.2lf\n", (double)clock() / CLOCKS_PER_SEC)
/*************** Program Begin **********************/
bool dp[5000][5001];
class PalindromicSubstringsDiv2 {
public:
int count(vector <string> S1, vector <string> S2) {
memset(dp, 0, sizeof(dp));
int res = 0;
string S;
for (int i = 0; i < S1.size(); i++) {
S += S1[i];
}
for (int i = 0; i < S2.size(); i++) {
S += S2[i];
}
int N = S.size();
for (int i = 0; i < N; i++) {
dp[i][i] = true;
++res;
}
for (int len = 2; len <= N; len++) {
for (int i = 0; i <= N - len; i++) {
if (S[i] == S[i + len - 1]) {
if (len == 2 || dp[i+1][i + len - 2] == true) {
dp[i][i+ len - 1] = true;
++res;
}
}
}
}
return res;
}
};
/************** Program End ************************/
相关文章推荐
- SRM 607 D2 L3:CombinationLockDiv2,DP
- SRM 596 D2 L2:ColorfulRoad,dp
- SRM 581 D2 L2:SurveillanceSystem,重叠度
- SRM 576 D2 L2:ArcadeManao,DFS,善于根据实际问题使用最简便的方法
- SRM 588 D2 L2:GUMIAndSongsDiv2,冷静思考,好的算法简洁明了
- SRM 605 D1 L2:AlienAndSetDiv1,DP,bitmask
- SRM 601 D2 L3:WinterAndReindeers,dp
- SRM 576 D2 L2:ArcadeManao,DFS,善于根据实际问题使用最简便的方法
- SRM 588 D2 L2:GUMIAndSongsDiv2,冷静思考,好的算法简洁明了
- SRM 605 D2 L2:AlienAndGame
- SRM 601 D1 L2:WinterAndSnowmen, dp
- SRM 607 D1 L1:PalindromicSubstringsDiv1,DP
- SRM 581 D2 L2:SurveillanceSystem,重叠度
- SRM 597 D2 L2:LittleElephantAndString
- SRM 608 D2 L2:MysticAndCandiesEasy
- SRM 606 D2 L2:EllysNumberGuessing
- SRM 595 D2 L3:LittleElephantAndXor, dp
- SRM 605 D2 L3: AlienAndSetDiv2,DP
- SRM 576 D2 L3:CharacterBoard2
- TopCoder SRM 649 Div2 Problem 500 - CartInSupermarketEasy (区间DP)