Leetcode 132. 分割回文串 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