讨论/题目交流/🏆 第 183 场力扣周赛/
🏆 第 183 场力扣周赛

欢迎小伙伴们在这里交流分享你的参赛心得以及体验。【前往竞赛

image.png

4 分 - 非递增顺序的最小子序列
4 分 - 将二进制表示减到 1 的步骤数
6 分 - 最长快乐字符串
7 分 - 石子游戏 III

展开讨论
力扣 (LeetCode)发起于 2020-04-05

垃圾了半个小时的 T3 垃圾代码不能白写了。。。?
大概就是想搞快做出来,结果傻逼题自己写了个傻逼吧。
2700w 复杂度也 T 了,哎

#include <bits/stdc++.h>

using namespace std;

bool f[301][101][101][3][3];
pair<int, pair<int, int> > prex[301][101][101][3][3];
int stk[10001];
class Solution {
public:
    string longestDiverseString(int a, int b, int c) {
        string tans = "";
        pair<pair<int, int>, pair<int, pair<int, int> > > ans;
        memset(f, 0, sizeof(f));
        f[0][0][0][0][0] = true;
        for (int i = 1; i <= a + b + c; i ++) {
            for (int j = 0; j <= a; j ++) 
                for (int k = 0; k <= b; k ++) {
                    if (j + k > i) continue;
                    int l = i - 1 - j - k;
                    if (l > c) continue;
                    for (int x = 0; x < 3; ++ x) {
                        for (int y = 0; y < 3; ++ y) {
                            if (!f[i - 1][j][k][x][y]) continue;
                            if ((x != 0 || y != 2) && j < a) {
                                if (x == 0) {
                                    f[i][j + 1][k][0][y + 1] = true;
                                    prex[i][j + 1][k][0][y + 1] = make_pair(0, make_pair(x, y));
                                    ans = make_pair(make_pair(i, j + 1), make_pair(k, make_pair(0, y + 1)));
                                }
                                else {
                                    f[i][j + 1][k][0][1] = true;
                                    prex[i][j + 1][k][0][1] = make_pair(0, make_pair(x, y));
                                    ans = make_pair(make_pair(i, j + 1), make_pair(k, make_pair(0, 1)));
                                }
                            }
                            if ((x != 1 || y != 2) && k < b) {
                                if (x == 1) {
                                    f[i][j][k + 1][1][y + 1] = true;
                                    prex[i][j][k + 1][1][y + 1] = make_pair(1, make_pair(x, y));
                                    ans = make_pair(make_pair(i, j), make_pair(k + 1, make_pair(1, y + 1)));
                                }
                                else {
                                    f[i][j][k + 1][1][1] = true;
                                    prex[i][j][k + 1][1][1] = make_pair(1, make_pair(x, y));
                                    ans = make_pair(make_pair(i, j), make_pair(k + 1, make_pair(1, 1)));
                                }
                            }
                            if ((x != 2 || y != 2) && l < c) {
                                if (x == 2) {
                                    f[i][j][k][2][y + 1] = true;
                                    prex[i][j][k][2][y + 1] = make_pair(2, make_pair(x, y));
                                    ans = make_pair(make_pair(i, j), make_pair(k, make_pair(2, y + 1)));
                                }
                                else {
                                    f[i][j][k][2][1] = true;
                                    prex[i][j][k][2][1] = make_pair(2, make_pair(x, y));
                                    ans = make_pair(make_pair(i, j), make_pair(k, make_pair(2, 1)));
                                }
                                
                            }
                        }
                    }
            }
        }
        int top = 0;
        while (ans.first.first != 0) {
            int i = ans.first.first, j = ans.first.second;
            int k = ans.second.first, x = ans.second.second.first, y = ans.second.second.second;
            int nxt = prex[i][j][k][x][y].first;
            stk[++ top] = nxt;
            pair<int, int> tmp = prex[i][j][k][x][y].second;
            
            i --;
            if (nxt == 0) j --;
            else if (nxt == 1) k --;
            x = tmp.first, y = tmp.second;
            ans = make_pair(make_pair(i, j), make_pair(k, make_pair(x, y)));
        }
        for (int i = top; i >= 1; i --) tans += stk[i] + 'a';
        return tans;
        
    }
};
展开全部 22 讨论