请解释以下疑问

时间:2015-12-29 13:22:44

标签: c++ string dynamic-programming

以下是此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]的部分如何工作

4 个答案:

答案 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];