美团9.27 三四五题
由于当时第五题比较赶 直接在考试ide做了,没有保存,所以第五题是回忆版的,可能有些细节的遗漏,有哪位哥给我看下第五题的题目截图。具体题解有空更新。
//第三题dp
int main() {
int n;
cin >> n;
string s;
getline(cin, s);
getline(cin, s);
int e = -1;
int l = s.size();
vector<int> v(l, 0);
int re = 0;
if (s[0] == 'E'){v[0] = 1; e = 0;
}
else v[0] = -1;
for (int i = 1; i < l; i++) {
if (s[i] == 'E') {
if (e != -1) {
v[i] = max(1, v[e] + 1 - (i - e-1));
e = i;
}
else {
v[i] = 1; e = i;
}
re = max(re, v[i]);
}
else {
if (e != -1) {
v[i] = max(-1, v[e]-1 - (i - e - 1));
}
else {
v[i] = -1;
}
re = max(re, v[i]);
}
}
cout << re;
} //第四题bfs
int main() {
int n, m, x1, y1, x2, y2;
cin >> n >> m >> x1>>y1>>x2>>y2;
x1 -= 1; y1 -= 1; x2 -= 1; y2 -= 1;
vector<vector<int>> v(n, vector<int>(m, 0));
vector<vector<int>> vv(n, vector<int>(m, 0));
for (int i = 0; i < n; i++) {
for (int ii = 0; ii < m; ii++) {
cin >> v[i][ii];
}
}
for (int i = 0; i < n; i++) {
for (int ii = 0; ii < m; ii++) {
cin >> vv[i][ii];
}
}
vector<vector<int>> sig(n, vector<int>(m, 0));
int re = 0;
sig[x1][y1] = 1;
queue < vector<int>> q;
q.push({ x1,y1,0 });
sig[x1][y1] = 1;
while (!q.empty()) {
auto k = q.front();
q.pop();
int x = k[0], y = k[1], res = k[2];
if (x == x2 && y == y2) {
cout << res;
break;
}
if (x < 0 || y < 0 || x >= n || y >= m) continue;
int a = v[x][y], b = vv[x][y];
int sum = a + b;
if (res%sum < a) {
if (x + 1 < n && !sig[x + 1][y])
{
q.push({ x + 1,y,res + 1 }); sig[x + 1][y] = 1;
}
if (x - 1 >= 0 && !sig[x - 1][y])
{
q.push({ x - 1,y,res + 1 }); sig[x - 1][y] = 1;
}
}
else {
if (y + 1 < m && !sig[x][y + 1])
{
q.push({ x,y + 1,res + 1 }); sig[x][y + 1] = 1;
}
if (y - 1 >= 0 && !sig[x][y - 1])
{
q.push({ x,y - 1,res + 1 }); sig[x][y - 1] = 1;
}
}
q.push({ x,y,res + 1 });
}
} //第五题最小生成树思想下的数位dp
int main() {
int m;
cin >> m;
for (int i = 0; i < m; i++) {
int n;
cin >> n;
vector<vector<int>> vv(n, vector<int>(n, 0));
for (int i = 0; i < n; i++) {
for (int ii = 0; ii < n; ii++) {
cin >> vv[i][ii];
}
}
int l = 1 << n;
int re = INT_MAX / 2;
vector<vector<int>> v(n, vector<int>(l, INT_MAX / 2));
for (int i = 0; i < n; i++) v[i][0] = 0;
for (int i = 1; i < l; i++) {
for (int j = 0; j < n; j++) {
if (((i >> j) & 1) == 0) {
for (int k = 0; k < n; k++) {
if (((i >> k) & 1) == 1)
v[j][i] = min(v[j][i], vv[j][k] + v[k][i ^ (1 << k)]);
}
if ((i | (1 << j)) == l - 1) re = min(v[j][i], (int)re);
}
}
}
cout << re<<endl;
}
} 
