• leetcode(c++)(博弈类dp)


    #include <iostream>
    #include <vector>
    using namespace std;
    
    bool canWin(int n)
    {
        vector<bool>dp(max(n+1,4));
        dp[3] = dp[1] = dp[2] = true;
        for(int i = 4; i <= n; ++i)
        {
            dp[i] = !dp[i-1] || !dp[i-2] || !dp[i-3];
        }
        return dp[n];
    }
    
     int dfs(const vector<int>& piles, int i, int j, vector<vector<int>>&memo)
    {
        if(i > j) return 0;
        if(memo[i][j] != -1) return memo[i][j]; 
        memo[i][j] = max(piles[i] - dfs(piles,i+1,j,memo),piles[j]-dfs(piles,i,j-1,memo));
        return memo[i][j];
    }
    
    bool predictWinner(const vector<int>& piles)
    {
        int n = piles.size();
        vector<vector<int>>memo(n,vector<int>(n,-1));
        return dfs(piles,0,n,memo) > 0;
    }
    
    bool dfs(int n, vector<int>&memo)
    {
        if(1 == n)return false;
        if(memo[n]!=-1)return memo[n];
        bool canWin = false;
        for(int i = 1; i <= n/2; ++i)
        {
            if(n % i == 0 && !dfs(n-i,memo))
            {
                canWin = true;
                break;
            }
        }
        return memo[n] = canWin;
    }
    
    bool divisorGame(int n)
    {
        vector<int>memo(n+1,-1);
        return dfs(n,memo);
    }
    
    bool stonesGame(const vector<int>& stones)
    {
        int n = stones.size();
        vector<vector<int>>memo(n,vector<int>(n,-1));
        int max = dfs(stones,0,n-1,memo);
        return memo[0][n-1] > 0;
    }
    
    int minmax(const vector<int>& nums, int index, vector<int>&memo)
    {
        if(index == nums.size())return 0;
        if(memo[index]!=-1)return memo[index];
        int res = INT_MIN;
        int score = 0;
        for(int i = index; i < index + 3 && i < nums.size(); ++i)
        {
            score += nums[i];
            res = max(res,score - minmax(nums,index + 1,memo));
        }
        return memo[index] = res;
    
    }
    
    int stoneGameIII(const vector<int>& nums)
    {
        int n = nums.size();
        vector<int>memo(n,-1);
        return minmax(nums,0,memo);
    }
    
    bool winSquareGame(int n)
    {
        vector<bool>dp(n+1,false);
        for(int i = 1; i <= n; ++i)
        {
            for(int k = 1; k * k <= i; ++k)
            {
                if(!dp[i-k*k])
                {
                    dp[i] = true;
                    break;
                }
                
            }
        }
        return dp[n];
    }
    
    int main()
    {
        //LeetCode292
        cout << canWin(4) << endl;
    
        //LeetCode486
        vector<int>v{1,5,233,7};
        cout << predictWinner(v) << endl;
    
        //LeetCode1025
        cout << divisorGame(4) << endl;
    
        //LeetCode877
        vector<int>stones{5,3,4,5};
        cout << stonesGame(stones) << endl;
    
        //LeetCode1406
        vector<int>nums{1,2,3,-9};
        cout << stoneGameIII(nums) << endl;
    
        //LeetCode1510
        int n = 1;
        cout << winSquareGame(n) << endl;
        return 0;
    }
  • 相关阅读:
    如何提高IT团队的执行力?
    Internet Explorer 安全区域注册表项说明
    用C#编写ActiveX控件(一) 转载
    用C#编写ActiveX控件(二) 转载
    关于《用C#编写ActiveX控件》的几点说明 转载
    【经典】单调栈+离线+线段树区间更新——求所有子区间gcd之和 icpc cerc 2019 b
    SQL语句
    Windows 程序设计学习记录(1)类的定义和应用
    Windows 程序设计学习记录(2)数据链表删除,增加的算法
    推荐一些博客网站
  • 原文地址:https://www.cnblogs.com/fourmi/p/16214198.html
Copyright © 2020-2023  润新知