srm 556

来源:互联网 发布:js onclick传参 编辑:程序博客网 时间:2024/06/11 16:24

欢迎点此阅读QvQ

250


Description

一个点数为50的无向图,每个节点i有一个分值v[i],当你进入到v[i]的时候,你的分数是value()xorv[i],请问从点0开始,你任意走能获得的最大分数
value1023

Solution

注意权值为1023,bfs即可

Code

#include <bits/stdc++.h>using namespace std;#define pb push_back#define mp make_pair#define F first#define S secondtypedef long long LL;typedef pair<int, int> pii;const int N = 50, M = 1024;bool d[N][N], f[N][M];queue<pii> Q;struct XorTravelingSalesman {    int maxProfit(vector <int> a, vector <string> s) {        int n = a.size();                      for (int i = 0; i < n; ++i)            for (int j = 0; j < n; ++j)                if (s[i][j] == 'Y') d[i][j] = 1;        int mx = a[0];        f[0][a[0]] = 1;        Q.push(mp(0, a[0]));        while (Q.size()) {            pii t = Q.front();            Q.pop();            for (int i = 0; i < n; ++i)                 if (d[t.F][i] && !f[i][t.S ^ a[i]]) {                    f[i][t.S ^ a[i]] = 1;                    Q.push(mp(i, t.S ^ a[i]));                    mx = max(mx, t.S ^ a[i]);                }        }        return mx;    }};

500


Description

你手头上有一个数A,通过这个数A你要构造最小的大于等于B的数C,每次将A最左端的数拿走,放到C的最左或最右端

Solution

观察到,这个过程前i位的数对应B连续的一段
考虑数位dp,dp[i][l][r][fl]表示用了前i位,和B[l]B[r]的大小关系为fl的最小串
我们发现每次转移这个数可以通过放到最左或最右来转移,直接dp即可
我的大小关系fl设为
* (1): 3 “>=”
* (2): 2 “>”
* (3): 1 “=”
* (4): 0 任意状态

感觉写的挺烦的,非常愚蠢….

Code

#include <bits/stdc++.h>//dpusing namespace std;#define pb push_back#define mp make_pair#define F first#define S secondtypedef long long LL;typedef pair<int, int> pii;const int N = 55;int n, A[N], B[N];//3: >=//2: > //1: = //0: anystring f[N][N][N][4], inf;struct LeftRightDigitsGame2 {    string dp(int p, int l, int r, int fl) {        string &tmp = f[p][l][r][fl];        if (tmp != "!") return tmp;        tmp = "";        string x = string(1, (char)(A[p] + '0'));        if (l == r) {            if (fl == 3 && A[p] >= B[l])    return tmp = x;            if (fl == 2 && A[p] > B[l])     return tmp = x;            if (fl == 1 && A[p] == B[l])    return tmp = x;            if (fl == 0)    return tmp = x;            return tmp = "";        }        string t1 = inf, t2 = inf, t;        if (fl >= 2) {            if (A[p] > B[l]) {                t = dp(p - 1, l + 1, r, 0);                if (t != "")    t1 = min(t1, x + t);//(l + 1, r)            }            else if (A[p] == B[l]) {                t = dp(p - 1, l + 1, r, 2);                if (t != "")    t1 = min(t1, x + t);            }            t = dp(p - 1, l, r - 1, 2); //(l, r - 1)            if (t != "")    t2 = min(t2, t + x);            if (A[p] > B[r]) {                t = dp(p - 1, l, r - 1, 1);                if (t != "")    t2 = min(t2, t + x);            }        }        if (fl & 1) {            if (A[p] == B[l]) {//(l + 1, r)                t = dp(p - 1, l + 1, r, 1);                if (t != "")    t1 = min(t1, x + t);                                }            if (A[p] == B[r]) {//(l, r - 1)                t = dp(p - 1, l, r - 1, 1);                if (t != "")    t2 = min(t2, t + x);            }        }        if (!fl) {            t = dp(p - 1, l + 1, r, 0);            if (t != "")    t1 = min(t1, x + t);            t = dp(p - 1, l, r - 1, 0);            if (t != "")    t2 = min(t2, t + x);        }        tmp = min(t1, t2);        if (tmp == inf) tmp = "";        return tmp;    }    string minNumber(string a, string b) {        int n = a.size();        for (int i = 0; i < n; ++i) {            inf += "9";            for (int j = 0; j < n; ++j)                for (int k = 0; k < n; ++k)                    for (int l = 0; l < 4; ++l)                        f[i][j][k][l] = "!";        }        for (int i = 0; i < n; ++i) A[i] = a[i] - '0', B[i] = b[i] - '0';        string ans = dp(n - 1, 0, n - 1, 3);        if (ans == inf) ans = "";        return ans;    }};
0 0
原创粉丝点击