现在的位置: 首页 > 综合 > 正文

TCSRM 400 ReversalChain

2019年04月15日 ⁄ 综合 ⁄ 共 1105字 ⁄ 字号 评论关闭

记忆化搜索,类似邮局问题的dp。以下解法byACRush。

对于每一种string a -> string b,都有一个最小的转换步数。对长度分层考虑,当a首字符和b首字符相同时继续,当a首字符和b末字符相同时就可以调转。

class ReversalChain {
    map 
< stringint > m;
    
int minStep ( string a, string b )
    
{
        
if ( a == b )
            
return 0;
        
string hash = a + ' ' + b;
        
int t = m[hash];
        
if ( t ) return t;
        
int len = a.size ();
        t 
= 1 << 20;
        
if ( a[0== b[0] )
            setMin ( t, minStep ( a.substr ( 
1, len - 1 ), b.substr ( 1, len - 1 ) ) );
        
if ( a[len - 1== b[len - 1] )
            setMin ( t, minStep ( a.substr ( 
0, len - 1 ), b.substr ( 0, len - 1 ) ) );
        reverse ( a.begin (), a.end () );
        
if ( a[0== b[0] )
            setMin ( t, minStep ( a.substr ( 
1, len - 1 ), b.substr ( 1, len - 1 ) ) + 1 );
        
if ( a[len - 1== b[len - 1] )
            setMin ( t, minStep ( a.substr ( 
0, len - 1 ), b.substr ( 0, len - 1 ) ) + 1 );
        
return m[hash] = t;
    }

public:
    
int minReversal ( string init, string goal ) {
        m.clear ();
        
int res = minStep ( init, goal );
        
return res == 1 << 20 ? -1 : res;
    }

}
;

抱歉!评论已关闭.