SRM 571 D2L3:MagicMoleculeEasy,brute force
2014-03-08 15:45
411 查看
题目:http://community.topcoder.com/stat?c=problem_statement&pm=12439&rd=15491
参考:http://apps.topcoder.com/wiki/display/tc/SRM+571
由于k最大为14,且边的数量最大为 50 * 50 / 2,用回溯法剪枝。
代码:
#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 **********************/
int sortedPower[55];
vector <int> magicPower;
vector <string> magicBond;
vector <pii> edges;
int k, n;
int res;
bool cmp(int i, int j)
{
return (magicPower[i] > magicPower[j]);
}
class MagicMoleculeEasy {
public:
inline bool isAdded(int x, long long used) { return ( used & (1LL << x) ); }
inline long long add(int x, long long used) { return (used | (1LL << x) ); }
void backtrack(int p, int cnt, long long used)
{
if (p == edges.size()) {
int sum = 0;
for (int i = 0; i < n; i++) {
if (!isAdded( sortedPower[i], used )) {
if (cnt < k) {
++cnt;
sum += magicPower[ sortedPower[i] ];
}
} else {
sum += magicPower[ sortedPower[i] ];
}
}
if (cnt != k) {
sum = -1;
}
res = max(res, sum);
return;
}
int x = edges[p].first, y = edges[p].second;
if (!isAdded(x, used) && !isAdded(y, used)) {
if (cnt + 1 <= k) {
// add x
backtrack(p + 1, cnt + 1, add(x, used));
// add y
backtrack(p + 1, cnt + 1, add(y, used));
}
} else {
// not add
backtrack(p + 1, cnt, used);
}
}
int maxMagicPower(vector <int> _magicPower, vector <string> _magicBond, int _k) {
magicPower = _magicPower;
magicBond = _magicBond;
k = _k;
n = magicPower.size();
for (int i = 0; i < n; i++) {
sortedPower[i] = i;
}
sort(sortedPower, sortedPower + n, cmp);
edges.clear();
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (magicBond[i][j] == 'Y') {
edges.push_back(mkp(i, j));
}
}
}
res = -1;
backtrack(0, 0, 0);
return res;
}
};
/************** Program End ************************/
参考:http://apps.topcoder.com/wiki/display/tc/SRM+571
由于k最大为14,且边的数量最大为 50 * 50 / 2,用回溯法剪枝。
代码:
#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 **********************/
int sortedPower[55];
vector <int> magicPower;
vector <string> magicBond;
vector <pii> edges;
int k, n;
int res;
bool cmp(int i, int j)
{
return (magicPower[i] > magicPower[j]);
}
class MagicMoleculeEasy {
public:
inline bool isAdded(int x, long long used) { return ( used & (1LL << x) ); }
inline long long add(int x, long long used) { return (used | (1LL << x) ); }
void backtrack(int p, int cnt, long long used)
{
if (p == edges.size()) {
int sum = 0;
for (int i = 0; i < n; i++) {
if (!isAdded( sortedPower[i], used )) {
if (cnt < k) {
++cnt;
sum += magicPower[ sortedPower[i] ];
}
} else {
sum += magicPower[ sortedPower[i] ];
}
}
if (cnt != k) {
sum = -1;
}
res = max(res, sum);
return;
}
int x = edges[p].first, y = edges[p].second;
if (!isAdded(x, used) && !isAdded(y, used)) {
if (cnt + 1 <= k) {
// add x
backtrack(p + 1, cnt + 1, add(x, used));
// add y
backtrack(p + 1, cnt + 1, add(y, used));
}
} else {
// not add
backtrack(p + 1, cnt, used);
}
}
int maxMagicPower(vector <int> _magicPower, vector <string> _magicBond, int _k) {
magicPower = _magicPower;
magicBond = _magicBond;
k = _k;
n = magicPower.size();
for (int i = 0; i < n; i++) {
sortedPower[i] = i;
}
sort(sortedPower, sortedPower + n, cmp);
edges.clear();
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (magicBond[i][j] == 'Y') {
edges.push_back(mkp(i, j));
}
}
}
res = -1;
backtrack(0, 0, 0);
return res;
}
};
/************** Program End ************************/
相关文章推荐
- SRM 571 D1L2:MagicMolecule,brute force
- SRM 510 D2L3:TheLuckyBasesDivTwo,brute force,optimization
- Topcoder srm 653 div.2 500 - RockPaperScissorsMagicEasy(DP)
- TopCoder SRM 653 Div2 Problem 500 - RockPaperScissorsMagicEasy (DP)
- SRM 610 D2L3:MiningGoldEasy,dp
- SRM 571 250 DIV2
- SRM 212 Div II Level Two: WinningRecord,Brute Force
- SRM DIV2 573 TeamContestEasy
- SRM 598 DIV2 1000 FoxAndFencingEasy
- SRM 608 D2 L3:BigOEasy,DFS
- [TC SRM 571] DIV1 1000
- TopCoder SRM 571 题解
- Test SRM Level Three: LargestCircle, Brute Force
- Topcoder SRM 566 DIV2 1000 FencingPenguinsEasy
- SRM 608 D2 L2:MysticAndCandiesEasy
- SRM 611 DIV2 1000 ElephantDrinkingEasy
- SRM 627 D2L3: BubbleSortWithReversals, dp, 冒泡排序
- SRM 591 D2L3:YetAnotherTwoTeamsProblem,dp
- SRM 622 D2L3: Subsets, math, backtrack
- Charming Python: Decorators make magic easy