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

srm 528

时间:2015-05-28 20:00:29      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

250

Solution

唔,这是个傻逼题,随便暴力下就好= =

Code

#include <bits/stdc++.h>
using namespace std;
class Cut {
    public:
    int getMaximum(vector <int> eelLengths, int maxCuts) {
        sort(eelLengths.begin(), eelLengths.end());
        int n = eelLengths.size();
        int ans = 0;
        for (int i = 0; i < n; ++i) {
            if (eelLengths[i] % 10 == 0) {
                int t = min(eelLengths[i] / 10 - 1, maxCuts);
                if ((t + 1) * 10 != eelLengths[i])  --ans;  
                ans += t + 1;
                maxCuts -= t;
            }
        }
        for (int i = 0; i < n; ++i) {
            if (eelLengths[i] % 10 != 0) {
                if (maxCuts > 0) {
                    int t = min(eelLengths[i] / 10, maxCuts);
                    ans += t;
                    maxCuts -= t;
                }
            }
        }
        return ans;
    }
};

500

题意:

给你一个”ox”串,问你有多少选取子序列的方法,使得选出的两个子序列相同,串的长度40

Solution

首先两个子序列长度20,我们可以220暴力枚举这个子序列是什么,然后用这个串匹配即可。f[i][j]表示匹配第一个子序列到第i个位置,匹配第二个子序列j个位置,dp即可

Code:

#include <bits/stdc++.h>//枚举+dp
using namespace std;
long long f[21][21];
class SPartition {
    public:
    long long getCount(string s) {
        int n = s.size(); 
        int tx = 0, to = 0;
        for (int i = 0; i < n; ++i) {
            if (s[i] == ‘x‘)    ++tx;
            else ++to;
        }
        if ((tx & 1) || (to & 1))   return 0;
        long long ans = 0;
        for (int i = 0; i < (1 << (n / 2)); ++i) {
            memset(f, 0, sizeof(f));
            f[0][0] = 1;
            if (__builtin_popcount(i) != tx / 2)    continue;
            for (int j = 0; j < n; ++j) {
                for (int k = 0; k <= min(n / 2, j); ++k) 
                    if (s[j] == ‘x‘) {
                        if (f[k][j - k]){
                            if (k != n / 2 && (i >> k & 1)) f[k + 1][j - k] += f[k][j - k];
                            if (j - k != n / 2 && (i >> (j - k) & 1))   f[k][j - k + 1] += f[k][j - k];
                        }
                    }
                    else {
                        if (f[k][j - k]) {
                            if (k != n / 2 && !(i >> k & 1))    f[k + 1][j - k] += f[k][j - k];
                            if (j - k != n / 2 && !(i >> (j - k) & 1))  f[k][j - k + 1] += f[k][j - k];
                        }
                    }
            }
            ans += f[n / 2][n / 2];
        }
        return ans;
    }
};


srm 528

标签:

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

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