srm 533

时间:2023-11-10 19:38:44

250


Description

给你一串数字序列,每次删掉第i个数。获得权值w[i−1]×w[i+1],求最后剩下第一个和最后一个数获得的最大权值和

Solution

简单dp,枚举断点就可以

Code

#include <bits/stdc++.h>
using namespace std;
const int N = 55;
typedef long long LL;
LL f[N][N];
vector<int> w;
LL dp(int l, int r) {
if (r - l == 1) return f[l][r] = 0;
LL &t = f[l][r];
if (~t) return t;
t = 0;
for (int i = l + 1; i < r; ++i) {
t = max(t, dp(l, i) + dp(i, r) + w[l] * w[r]);
}
return t;
}
class CasketOfStar {
public:
int maxEnergy(vector <int> weight) {
w = weight;
int n = weight.size();
memset(f, -1, sizeof(f));
return dp(0, n - 1);
}
};

500


Description:

给定一个字符矩阵。我们要按顺序取遍全部的”#”。规定操作顺序是取同行的一个”#”,再取同列的一个”#”,以此类推,问能不能取遍

Solution

非常easy反应到,这是一道欧拉回路的题,行列单独考虑。处理一些细节就能够了。注意到假设是欧拉通路的话起始点的问题就能够了。整体来说比較简单。

Code:

#include <bits/stdc++.h>
using namespace std;
const int N = 55;
int r[N], c[N];
bool ok[N][N], vis[N][N];
int n, m, tot;
void dfs(int x, int y) {
vis[x][y] = 1;
--tot;
for (int j = 0; j < m; ++j)
if (ok[x][j] && !vis[x][j]) dfs(x, j);
for (int i = 0; i < n; ++i)
if (ok[i][y] && !vis[i][y]) dfs(i, y);
}
class MagicBoard {
public:
string ableToUnlock(vector <string> board) {
n = board.size(), m = board[0].size();
int x, y;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
if (board[i][j] == '#') {
ok[i][j] = 1;
++r[i], ++c[j];
x = i, y = j;
++tot;
}
int rr = 0, cc = 0;
for (int i = 0; i < n; ++i) if (r[i] & 1) ++rr;
for (int j = 0; j < m; ++j) if (c[j] & 1) ++cc;
if (rr + cc > 2) return "NO";
if (rr + cc == 2 && !cc) return "NO";
dfs(x, y);
cout << tot << endl;
return tot ? "NO" : "YES";
}
}P;
int main() {
vector<string> s;
s.push_back("##"), s.push_back(".#");
P.ableToUnlock(s);
return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。