原题题目
代码实现(首刷超时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];
}