社区讨论

求指正时间复杂度

P14256平局(draw)参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhphuqq3
此快照首次捕获于
2025/11/08 07:35
3 个月前
此快照最后确认于
2025/11/09 02:26
3 个月前
查看原帖
rt,乱胡了一个暴力,分析出时间复杂度为 O(2n3n)O(2^n \cdot 3^n) 但是连 n10n \leq 10 的点都过不了,怀疑分析错了,求指正。
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 条回复,欢迎继续交流。

正在加载回复...