Leetcode 132. Split Palindrome II(DAY 66)----動的計画法の学習期間(外で雷が鳴るのを恐れています。jpg)

元のタイトル

ここに画像の説明を挿入します



コードの実装(最適化される最初のブラシタイムアウトDP)

int minCut(char * s){
    
    
    int strl = strlen(s),start,end,range;
    int dp[strl+1][strl+1];
    memset(dp,0,sizeof(dp));
    for(end = 0;end<strl;end++)
    {
    
    
        for(start = end;start>=0;start--)
        {
    
    
            if(s[start] == s[end])
            {
    
    
                if(end <= start+1 || dp[start+1][end-1])  
                    dp[start][end] = 1;
            }
        }
    }

    if(dp[0][strl-1])   return 0;
    int ret[strl+1][strl+1];
    memset(ret,0,sizeof(ret));
    
    for(end=1;end<=strl-1;end++)
    {
    
    
        for(start=end-1;start>=0;start--)
        {
    
    
            if(dp[start][end])  ret[start][end] = 0;
            else
            {
    
    
                ret[start][end] = INT_MAX;
                for(range=end;range>start;range--)
                {
    
    
                    if(dp[start][range-1] && dp[range][end] || ret[start][range-1]!= INT_MAX && ret[range][end]!=INT_MAX)
                        ret[start][end] = fmin(ret[start][end],ret[start][range-1] + ret[range][end] +1);
                }
            }
        }
    }
    return ret[0][strl-1];
}

コードの実装(動的計画法に最適化されたバージョン)

int minCut(char * s){
    
    
    int strl = strlen(s),start,end,range;
    int dp[strl+1][strl+1];
    memset(dp,0,sizeof(dp));
    for(end = 0;end<strl;end++)
    {
    
    
        for(start = end;start>=0;start--)
        {
    
    
            if(s[start] == s[end])
            {
    
    
                if(end <= start+1 || dp[start+1][end-1])  
                    dp[start][end] = 1;
            }
        }
    }

    if(dp[0][strl-1])   return 0;
    int ret[strl];
    
    for(end=0;end<strl;end++)
    {
    
    
        if(dp[0][end])  ret[end] = 0;
        else
        {
    
    
            ret[end] = INT_MAX;
            for(start=end;start>0;start--)
            {
    
    
                if(dp[start][end] && ret[start-1] != INT_MAX)
                    ret[end] = fmin(ret[end],ret[start-1] + 1);
            }
        }
    }
    return ret[strl-1];
}

おすすめ

転載: blog.csdn.net/qq_37500516/article/details/114871975