http://haixiaoyang.wordpress.com/category/dynamic-programming/
/*
get all possibilities of letter combinations
a->1, b->2, ...., z->26
so for "112" it returns 3, which are
1,1,2 => aab
11,2 => kb
1,12 => al
*/
int _inner_ways(const char* pStr)
{
if (*pStr == 0)
return 1;
if (*pStr <= '0' || *pStr > '9')
return 0;
int n = _inner_ways(pStr+1);
if ((*pStr == '1' && *(pStr + 1) >= '0' && *(pStr + 1) <= '9')
|| (*pStr == '2' && *(pStr + 1) >= '0' && *(pStr + 1) <= '6'))
n += _inner_ways(pStr+2);
return n;
}
int GetWays(const char* pStr)
{
if (NULL == pStr || *pStr == 0)
return 0;
return _inner_ways(pStr);
}
int GetWaysDP(const char* pStr)
{
if (NULL == pStr || *pStr == 0)
return 0;
int nLen = strlen(pStr);
int nTmp2 = 1;
int nTmp1 = 0;
if (pStr[nLen-1] > '0' && pStr[nLen-1] <= '9')
nTmp1 = 1;
int nRes = nTmp1;
for (int i = nLen-2; i >= 0; i--)
{
int nTmp = 0;
if (pStr[i] > '0' && pStr[i] <= '9')
nTmp += nTmp1;
if ((pStr[i] == '1' && pStr[i+1] >= '0' && pStr[i+1] <= '9') ||
(pStr[i] == '2' && pStr[i+1] >= '0' && pStr[i+1] <= '6'))
nTmp += nTmp2;
nRes = nTmp;
nTmp2 = nTmp1;
nTmp1 = nRes;
}
return nRes;
}
第一种方法是递归,但是递归明显有很多重复计算
第二种方法是动态规划,这里dp是从右向左的