1. 程式人生 > 實用技巧 >Leetcode 周賽 219 題解

Leetcode 周賽 219 題解

1688. 比賽中的配對次數

共有n個隊伍,一個冠軍,需要淘汰n-1個 隊伍。
每一場比賽淘汰一個隊伍,因此進行了n-1場比賽。
所以共有n-1個配對。

class Solution {
public:
    int numberOfMatches(int n) {
        return n - 1;
    }
};

**1689.十-二進位制數的最少數目 **

簡單思維

返回所給的字串中最大的那個數便可以

class Solution {
public:
    int minPartitions(string n) {
        int x = 0;
        for(int i = 0 ;i <  n.size(); i ++){
            x = max(x,n[i] - '0');
        }
        return x;
    }
};

1690. 石子游戲 VII

字首和+區間DP+博弈論

博弈論:最壞的情況取最好的

\[f[i,j]表示在區間[i,j],先手-後手的分值最大\\ s[i,j]表示在區間的和\\ 決策:先手決定取i還是取j,當取i時,分值為s[i+1,j]-f[i+1][j],當取j時,分值為s[i,j-1]-f[i][j-1] \]

class Solution {
public:
    int stoneGameVII(vector<int>& stones) {
        int n = stones.size();
        vector<int> s(n+1);
        for(int i = 1;i <= n;i ++){
            s[i] = s[i-1] + stones[i-1];
        }
        vector<vector<int>> f(n+1,vector<int>(n+1));
        for(int len = 2;len <= n;len ++){
            for(int i = 1;i + len - 1 <= n;i ++){
                int j = i + len - 1;
                f[i][j] = max(s[j] - s[i] - f[i+1][j],s[j-1] - s[i-1] - f[i][j-1]);
            }
        }
        return f[1][n];
    }
};

1691. 堆疊長方體的最大高度

最大下降子序列

當存在一種方案滿足條件時

\[a_1>a_2\\ b_1>b_2\\ c_1>c_2\\ 對其進行排序之後,仍然滿足條件 \]

滿足條件

\[1.合法\\ 2.c[i]最大且為高\\ \]

class Solution {
public:
    int maxHeight(vector<vector<int>>& w) {
        for(auto &x : w) sort(x.begin(),x.end());
        sort(w.begin(),w.end(),greater<vector<int>>());
        int n = w.size();
        vector<int> f(n + 1);
        int res = 0;
        for(int i = 0; i < n;i ++){
            f[i] = w[i][2];
            for(int j = 0;j < i;j ++){
                if(w[j][0] >= w[i][0] && w[j][1] >= w[i][1] && w[j][2] >= w[i][2])
                f[i] = max(f[i],f[j] + w[i][2]); 
            }
            res = max(res,f[i]);
        }
        return res;
    }
};