以下是此SPOJ问题的实施:www.spoj.com/problems/ACODE/
#include <bits/stdc++.h>
using namespace std;
char str[5002];
int main() {
scanf("%s",str);
while(str[0]!='0')
{
int len=strlen(str);
long long dp[len+1]={0};
/*base case*/
dp[0]=1;
int i=1; //i for index
while(i<len)
{
int num=(str[i-1]-'0')*10;
num+=str[i]-'0';
/*checking for valid 1 digit number*/
if(str[i]-'0') //Why minus '0'*10
{
dp[i]=dp[i-1];
}
/*checking for two digit number*/
if(num>9 && num<=26)
{
dp[i]+=dp[i-2<0?0:i-2]; //How does this work?
}
i++;
}
printf("%lld\n",dp[len-1]);
scanf("%s",str);
}
return 0;
}
以下是我不明白的事情: - 为什么dp初始化为0? 为什么我们减去&#39; 0&#39; * 10? 和 dp [i-1]和dp [i-2]的部分如何工作?
答案 0 :(得分:0)
int num=(str[i-1]-'0')*10;
在此将字符转换为整数。假设str[i-1]
具有字符'2'
,因此'2'-'0'
将导致2
,然后乘以10
。
因此,根据示例,num
将具有值2*10=20
。
dp[i]+=dp[i-2<0?0:i-2]; //How does this work?
在此,它的作用是在数组i
中的索引dp
处加上整数加上在表达式中计算的索引处的整数。
表达式(使用三元运算符)i-2<0?0:i-2
将评估,如果i-2
小于0
,那么值将为0
如果没有,则值为i-2
。
答案 1 :(得分:0)
为什么dp初始化为0
long long dp [len + 1] = {0};
上面的行将使用0初始化完整数组。
为什么我们减去&#39; 0&#39;
语句str[i-1]
将返回字符值,要将字符转换为整数,我们必须从&#39; 0&#39;(ASCII值为48)中减去它。
dp [i-1]和dp [i-2]的部分是如何工作的? 这是通过索引访问数组元素的方法。
答案 2 :(得分:0)
这只是一行中的if子句。
dp[i-2<0?0:i-2]
same as
if((i-2) < 0)
dp[0];
else
dp[i-2];
答案 3 :(得分:0)
为什么dp初始化为0?
用于使用例如加法运算dp[i]+=dp[i-2<0?0:i-2];
,您应该使用有效值而不是随机值
为什么我们减去&#39; 0&#39; * 10?
将char转换为int,你取代了&#39; 0&#39;的ascii。 (0x30)例如'1' /* 0x31 */ - '0' /* 0x30 */ = 1
以及dp [i-1]&amp;的部分如何? dp [i-2]工作? (
dp[i]+=dp[i-2<0?0:i-2];
)
这条指令是等效的:
if (i-2<0)
dp[i]+=dp[0];
else
dp[i]+=dp[i-2];