社区讨论

玄关求调 dp WA on #19,36

AT_abc344_d [ABC344D] String Bags参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@ltn2lnw7
此快照首次捕获于
2024/03/11 23:00
2 年前
此快照最后确认于
2024/03/12 14:18
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
string T, ss, x;
int n, m, cnt;
map<string, int> mp[105];
map<string, bool> f;
map<string, int>::iterator it;
bool check(string s) {
	if (s.length() > T.length()) return 0;
	for (int i = 0; i < s.length(); i++)
		if (s[i] != T[i]) return 0;
	return 1;
}
int main() {
	cin >> T;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> m;
		for (it = mp[i - 1].begin(); it != mp[i - 1].end(); ++it) if(f[it->first]) mp[i][it->first] = mp[i - 1][it->first];
		for (int j = 1; j <= m; j++) {
			cin >> ss;
			if (check(ss) && !f[ss]) {
				f[ss] = 1;
				mp[i][ss] = 1;
				continue;
			}
			for (it = mp[i - 1].begin(); it != mp[i - 1].end(); ++it) {
				x = it->first + ss;
				if (check(x)) {
					if (!f[x]) f[x] = 1, mp[i][x] = INT_MAX;
					if (check(it->first) && f[it->first])
						mp[i][x] = min(mp[i][x], mp[i - 1][it->first] + 1);
				}
				//cout << i << " " << x << " " << mp[i][x] << endl;
			}
		}
	}
	cout << (f[T] ? mp[n][T] : -1);
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...