【2022-06-19-第298场单周赛】

总结

最后一题大胆试一下就好了,挺简单的。

Q1.兼具大小写的最好英文字母

直接用哈希一顿搞。

class Solution {
public:
    long long sellingWood(int m, int n, vector<vector<int>>& p) {
        long long dp[m + 1][n + 1]; memset(dp, 0, sizeof(dp));
        map<pair<int, int>, long long> mp;
        for(auto &i : p){
            mp[{i[0], i[1]}] = max(mp[{i[0], i[1]}], i[2]);
        }
        for(int i = 1; i <= m; ++i){
            for(int j = 1; j <= n; ++j){
                dp[i][j] = mp[{i, j}];
                for(int k = 1; k <= i - 1; ++k) dp[i][j] = max(dp[k][j], dp[i - k][j]);
                for(int k = 1; k <= j - 1; ++k) dp[i][j] = max(dp[i][k], dp[i][j - k]);
            }
        }
        return dp[m][n];   
    }
};

Q2.个位数字为 K 的整数之和

k的倍数的个位数找出来,然后判断一下是不是会大于num。

class Solution {
public:
    int minimumNumbers(int num, int k) {
        if(!num) return 0;
        vector<int> a;
        a.push_back(k);
        int t = (k * 2) % 10;
        while(t != k){
            a.push_back(t);
            t = (t + k) % 10;
        }
        int ret = -1;
        for(int i = 0; i < a.size(); ++i){
            if(a[i] == num % 10){
                ret = i;
            }
        }
        if((ret + 1) * k > num) return -1;
        else if(ret == -1) return -1;
        else return ret + 1;
    }
};

Q3.小于等于 K 的最长二进制子序列

贪心,把0都加入,然后把1慢慢加。

class Solution {
public:
    
    long long poww(int n){
        long long ret = 1;
        for(int i = 0; i < n; ++i){
            ret *= 2;
            if(ret > INT_MAX) return INT_MAX;
        }
        return ret;
    }
    
    int longestSubsequence(string s, int k) {
        int n = s.size();
        
        long long t = 0, ret = 0, lst = -1;
        vector<int> a;
        for(int i = n-1; i>=0; --i){
            if(s[i] == '1'){
                t += poww(n - 1 - i);
                if(t <= k){
                    ++ret;
                    a.push_back(i);
                }
                else break;
            }
        }
        vector<int> b;
        for(int i = 0; i < n; ++i){
            if(s[i] =='0'){
                ++ret;
                b.push_back(i);
            }
        }

        return ret;
    }
};

Q4.卖木块

直接dp即可。

class Solution {
public:
    long long sellingWood(int m, int n, vector<vector<int>>& p) {
        long long dp[m + 1][n + 1]; memset(dp, 0, sizeof(dp));
        int h[m + 1][n + 1]; memset(h, 0, sizeof(h));
        for(auto &i : p){
            h[i[0]][i[1]] = max(h[i[0]][i[1]], i[2]);
        }
        for(int i = 1; i <= m; ++i){
            for(int j = 1; j <= n; ++j){
                dp[i][j] = h[i][j];
                for(int k = 1; k <= i - 1; ++k) dp[i][j] = max(dp[i][j], dp[k][j] + dp[i - k][j]);
                for(int k = 1; k <= j - 1; ++k) dp[i][j] = max(dp[i][j], dp[i][k] + dp[i][j - k]);
            }
        }
        return dp[m][n];
        
    }
};
posted on 2022-06-24 20:52  damnglamour  阅读(19)  评论(0)    收藏  举报