码迷,mamicode.com
首页 > 其他好文 > 详细

srm 532

时间:2015-06-05 17:39:27      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:

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|A?B|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[i?1][j][0][mask<<1],即从i?1转移过来。
k=K的时候,我们如果这条边不连则f[i][j][k][mask]=f[i][j][k+1][mask],连的话f[i][j][k][mask]+=f[i][j?1][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];
    }
};





srm 532

标签:

原文地址:http://blog.csdn.net/mlzmlz95/article/details/46378321

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!