更多动态规划,参考牛客网总结:动态规划
目录
题目描述:
题解:
动态规划
状态转移方程:
如果c(i-1,i)==10或20,dp[i]=dp[i-2]
如果11<=c(i-1,i)<=19,21<=c(i-1,i)<=26时,dp[i]=dp[i-1]+dp[i-2]
其他,dp[i]=dp[i-1]
其中,dp(i) 表示数字从左往右第 i 个的翻译种数,c(i-1, i) 表示数字从左往右第 i - 1 和第 i 个字符拼接后的数字(例如:12258 的 c(1, 2)=22)。
class Solution {
public:
/**
* 解码
* @param nums string字符串 数字串
* @return int整型
*/
int solve(string nums) {
// write code here
int len=nums.size();
if(len==0)
return 0;
if(nums[0]=='0')
return 0;
vector<int> dp(len+1,0);
dp[0]=1;
dp[1]=1;
for(int i=2;i<=len;i++)
{
int val=(nums[i-2]-'0')*10+(nums[i-1]-'0');
if(10<=val&&val<=26)
{
dp[i]+=dp[i-2];
}
if(nums[i-1]>'0')
{
dp[i]+=dp[i-1];
}
}
return dp[len];
}
};