srm 533

来源:互联网 发布:淘宝企业店铺代办 编辑:程序博客网 时间:2024/06/14 06:16

250



Description

给你一串数字序列,每次删掉第i个数,获得权值w[i1]×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

很容易反应到,这是一道欧拉回路的题,行列单独考虑,处理一些细节就可以了。注意到如果是欧拉通路的话起始点的问题就可以了。总体来说比较简单。

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;}
0 0
原创粉丝点击