srm 532

300



Description

給你一坨純數字的,帶”.”和數字的字符串,讓你拼起來,使得取一個連續段的字符串使得數字之和最大

Solution

模擬題。考慮詳細就好,我自己的代碼比較麻煩= =b看看就好T_T

Code

#include <bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define F first
#define S second
vector<pair<int, int> > a;
int b[55];
class DengklekMakingChains {
    public:
    int maxBeauty(vector <string> chains) {
        int n = chains.size(); 
        int ans = 0;
        for (int i = 0; i < n; ++i) {
            int t = 0, t1 = 0, t2 = 0;
            bool f = 1;
            for (int j = 0; j < chains[i].size(); ++j) {
                if (chains[i][j] >= '0' && chains[i][j] <= '9')  t += chains[i][j] - '0';
                if (chains[i][j] == '.') {
                    f = 0;
                    if (!t1)    t1 = t;
                    b[i] = max(b[i], t);
                    t = 0;
                }
            }
            if (f)  ans += t;
            else {
                if (chains[i][0] == '.')    t1 = 0;
                b[i] = max(b[i], t);
                t2 = t, a.pb(mp(t1, t2));
            }
        }
        n = a.size();
        int t = 0;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                if (i == j) continue;
                t = max(t, a[i].S + a[j].F);
            }
            t = max(t, a[i].S);
            t = max(t, a[i].F);
        }
        ans += t;
        n = chains.size();
        for (int i = 0; i < n; ++i) ans = max(ans, b[i]);
        return ans;
    }
};




450



Description:

給定n 個房子,你要建m 條邊,每條邊連接兩個房子A,B滿足0|AB|Kn,m30,k8 ,且每個房子的度數必須是偶數。

Solution

我們發現k8 ,自然想到不妨考慮一個房子連邊只往後連,並且一旦和編號爲x 的連過邊則不再連比x 編號大的點連邊,防止算重。
f[i][j][k][mask] 表示當前已經表示按順序解決了第i 個房子,已經用了j 條邊,考慮ii+k+1 ,當前i 以及後面k 個房子的奇偶狀態是mask
如果k=K ,且i+k+1 這個房子的度是偶數,顯然可以f[i][j][K][mask]=f[i1][j][0][mask<<1] ,即從i1 轉移過來。
k=K 的時候,我們如果這條邊不連則f[i][j][k][mask]=f[i][j][k+1][mask] ,連的話f[i][j][k][mask]+=f[i][j1][k][mask ^ ((1<<(k+1))|1)]
f[n][m][0][0] 即爲答案

Code:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 31, MOD = 1e9 + 7;
int n, m, k, f[N][N][9][(1 << 9) + 1];
class DengklekBuildingRoads {
    public:
    int numWays(int N, int M, int K) {
        f[0][0][0][0] = 1;
        for (int i = 1; i <= N; ++i)
            for (int j = 0; j <= M; ++j) {
                for (int mask = 0; mask < 1 << (K + 1); ++mask) 
                    if (!(mask >> K & 1))   f[i][j][K][mask] = f[i - 1][j][0][mask << 1];
                for (int k = K - 1; k >= 0; --k) {
                    for (int mask = 0; mask < 1 << (K + 1); ++mask) {
                        f[i][j][k][mask] = f[i][j][k + 1][mask];
                        if (i + k + 1 <= N && j)    (f[i][j][k][mask] += f[i][j - 1][k][mask ^ ((1 << (k + 1)) | 1)]) %= MOD;
                    }
                }
            }
        return f[N][M][0][0];
    }
};





發佈了86 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章