elysia_nice 2024-04-18 09:01 采纳率: 80%
浏览 8
已结题

leetcode 294 翻转游戏II c++

class Solution {
public:
    bool canWin(string s) {
        vector<int> dec;
        s.push_back('-');
        int cnt = 0, dpSize = 0;
        /* 分解原状态至多个不可分解的子态 */
        for(char c: s){
            if(c == '+') ++cnt;
            else{
                dec.push_back(cnt);
                dpSize = max(dpSize, cnt);
                cnt = 0;
            }
        }
        if(dpSize <= 1) return false;

        vector<int> dp(dpSize + 1, 0);

        /* 枚举所有不可细分的子状态(0,1时为0已经返回false,从2开始遍历) */
        for(int i = 2; i <= dpSize; ++i){
            /* 子状态不可以拆分,那么子状态的值等于所有下一个状态的集合外的最小非负整数 */
            unordered_set<int> Set;
            for(int j = 0;j < i/2; ++j){
                /* 每种翻转后,形成的次态可以分解成两种状态 */
                /* 可分解的状态(g值)等于各分解子状态(g值)的异或和 */
                Set.insert(dp[j] ^ dp[i-j-2]);
            }
            /* 找到最小的不在集合中的数字,就是本状态的g值 */
            for(int k = 0; k <= i / 2; ++k) {
                if(Set.count(k))continue;
                else {
                    dp[i] = k;
                    break;
                }
            }
        }

        return accumulate(begin(dec), end(dec), int(), [&](auto a, auto b){return a ^ dp[b];});
    }    
};

作者:梦璃夜·天星
链接:https://leetcode.cn/problems/flip-game-ii/solutions/906239/c-sprague-grundy-acmbo-yi-lun-xiang-guan-1ddj/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

借鉴 leetcode题解的代码,但是 在k循环 求g值部分,为何可确定 g值 的范围在i/2之内? 对照 SG定理 没想出合适的解释.

  • 写回答

15条回答 默认 最新

报告相同问题?

问题事件

  • 系统已结题 4月27日
  • 赞助了问题酬金15元 4月19日
  • 创建了问题 4月18日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?