Leetcode 464. 我能赢吗(DAY 52) ----动态规划学习期 (图书馆复工! 进入半正常学习生活)

原题题目

在这里插入图片描述



代码实现(迷惑首刷大部分看解小部分自解)

bool calc(int choose,int maxChoosableInteger,int sparetotsl,char* dp)
{
    
       if(dp[choose])  return dp[choose] == 1;
    dp[choose] = 2;
    int i;
    for(i=1;i<=maxChoosableInteger;i++)
    {
    
    
        int t = 1<<(i-1);
        int c = choose;
        if((t & c) == 0)
        {
    
    
            c |= t;
            if(sparetotsl <= i || !calc(c,maxChoosableInteger,sparetotsl-i,dp))
            {
    
    
                dp[choose] = 1;
                break;
            }
        }
    }
    return dp[choose] == 1;
}


bool canIWin(int maxChoosableInteger, int desiredTotal){
    
    
    int sum = (1+maxChoosableInteger) * maxChoosableInteger /2;
    if(sum < desiredTotal)  return false;
    int t = 1<<maxChoosableInteger;
    int choose = 0;
    char* dp = (char*)malloc(sizeof(char) * (t));
    memset(dp,0,sizeof(char) * t);
    return calc(choose,maxChoosableInteger,desiredTotal,dp);
}


代码实现(首刷大部分看解 数组型)

bool calc(int choose,int maxChoosableInteger,int sparetotsl,int* dp)
{
    
       if(dp[choose])  return dp[choose] == 1;
    dp[choose] = 2;
    int i;
    for(i=1;i<=maxChoosableInteger;i++)
    {
    
    
        int t = 1<<(i-1);
        int c = choose;
        if((t & c) == 0)
        {
    
    
            c |= t;
            if(sparetotsl <= i || !calc(c,maxChoosableInteger,sparetotsl-i,dp))
            {
    
    
                dp[choose] = 1;
                break;
            }
        }
    }
    return dp[choose] == 1;
}


bool canIWin(int maxChoosableInteger, int desiredTotal){
    
    
    int sum = (1+maxChoosableInteger) * maxChoosableInteger /2;
    if(sum < desiredTotal)  return false;
    int t = 1<<maxChoosableInteger;
    int choose = 0;
    int* dp = (int*)malloc(sizeof(int) * (t));
    memset(dp,0,sizeof(int) * t);
    return calc(choose,maxChoosableInteger,desiredTotal,dp);
}

猜你喜欢

转载自blog.csdn.net/qq_37500516/article/details/113975569
今日推荐