社区讨论
求指正时间复杂度
P14256平局(draw)参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhphuqq3
- 此快照首次捕获于
- 2025/11/08 07:35 3 个月前
- 此快照最后确认于
- 2025/11/09 02:26 3 个月前
rt,乱胡了一个暴力,分析出时间复杂度为 但是连 的点都过不了,怀疑分析错了,求指正。
CPP#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
bool Mbe;
const int MOD = 1e9 + 7;
int n;
string s;
vector<char> v[8];
unordered_map<string, int> mp;
vector<string> ops;
int fight(char a, char b) {
if (a == b) return 0;
if ((a == 'S' && b == 'P') || (a == 'R' && b == 'S') || (a == 'P' && b == 'R'))return 1;
return -1;
}
// 暴力找所有可能性
void dfs(string cur, int p) {
if (p > n) {
if (!mp[cur]) {
ops.push_back(cur);
mp[cur] = 1;
}
return;
}
if (cur[p] >= '1' && cur[p] <= '9') {
for (char ch : v[cur[p] - '0']) {
cur[p] = ch;
dfs(cur, p);
}
}
dfs(cur, p + 1);
}
// 暴力计数
int dfs2(string cur) {
if (cur.size() <= 2) return 0;
int maxx = -1;
for (int i = 1; i < cur.size() - 1; i++) {
char a = cur[i], b = cur[i + 1];
int res = fight(a, b);
string nxt = cur;
if (res == 1) { // 后者胜,删前者
nxt.erase(nxt.begin() + (1 + i));
maxx = max(maxx, dfs2(nxt));
}
else if (res == 0) { // 平局
string nxt1 = cur, nxt2 = cur;
nxt1.erase(nxt1.begin() + (1 + i));
nxt2.erase(nxt2.begin() + i);
maxx = max({maxx, 1 + dfs2(nxt1), 1 + dfs2(nxt2)});
} else { // 前者胜,删后者
nxt.erase(nxt.begin() + i);
maxx = max(maxx, dfs2(nxt));
}
}
return maxx;
}
void init() {
v[7].push_back('S'), v[7].push_back('R'), v[7].push_back('P');
v[6].push_back('R'), v[6].push_back('P');
v[3].push_back('S'), v[3].push_back('R');
v[5].push_back('S'), v[5].push_back('P');
}
bool Med;
int main() {
cerr << "Mem: " << (&Med - &Mbe) / 1048576.0 << "MB\n";
// freopen("F:\Code\OI\OIcodeSpace\in_out\.in","r",stdin);
// freopen("F:\Code\OI\OIcodeSpace\in_out\.out","w",stdout);
cin >> n;
cin >> s;
s = ' ' + s;
for (auto &u : s) {
if (u == '2') u = 'R';
if (u == '4') u = 'P';
if (u == '1') u = 'S';
}
init();
dfs(s, 1);
int ans = 0;
for (auto u : ops) {
// cout << u << ' ' <
ans += dfs2(u) % MOD;
ans %= MOD;
}
cout << ans << '\n';
cerr << "Time: " << double(clock() * 1.0 / CLOCKS_PER_SEC ) << '\n';
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...