zoukankan      html  css  js  c++  java
  • srm 533

    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

    非常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;
    }
    
    
    
    
    
    
    
    

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

  • 相关阅读:
    创建桌面快捷方式
    令牌桶在数据通信QoS流量监管中的应用
    cocos2d-x 实现clash of clans多点聚焦缩放场景
    NotePad++ 快捷键中文说明
    2017第24周日
    《自信力~成为更好的自己》晨读笔记
    不知道如何决定的时候就快速决定
    《意外之外》晨读笔记
    《从“为什么”开始》听书笔记
    解决电脑上网问题记录
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4882514.html
Copyright © 2011-2022 走看看