【问题标题】:Explain the following doubts please请解释以下疑惑
【发布时间】:2015-12-29 13:22:44
【问题描述】:

下面是这个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? 为什么我们减去'0'*10? dp[i-1] 和 dp[i-2] 部分是如何工作的

【问题讨论】:

  • 这是 C++ 代码吗?是你写的,还是别人的,因为你看不懂?
  • 解释这的代码?那是一整页代码! ;)
  • @WeatherVane - 注意:using namespace std;
  • @BobJarvis 这就是我评论的原因(连同#include &lt;bits/stdc++.h&gt;)
  • 啊——刚刚注意到它被标记为c。固定...

标签: c++ string dynamic-programming


【解决方案1】:

为什么dp初始化为0?

对于使用例如加法运算dp[i]+=dp[i-2&lt;0?0:i-2];,您应该使用有效值而不是随机值

为什么要减去'0'*10?

为了将 char 转换为 int,您可以在 '0' (0x30) 的 ascii 中加上符号,例如 '1' /* 0x31 */ - '0' /* 0x30 */ = 1

dp[i-1] & dp[i-2] 部分是如何工作的? (dp[i]+=dp[i-2&lt;0?0:i-2];)

这条指令是等价的:

if (i-2<0)
    dp[i]+=dp[0];
else
    dp[i]+=dp[i-2];

【讨论】:

  • 你没有看懂第三部分。 OP 不是在谈论 &amp; 运算符,而是在表达式中合并它们的部分。
  • 我的意思是我们为什么要使用 dp[i-2] ?
【解决方案2】:

这只是一行中的一个 if 子句。

dp[i-2<0?0:i-2]

same as

if((i-2) < 0) 
 dp[0]; 
else
 dp[i-2];

【讨论】:

    【解决方案3】:

    为什么dp初始化为0

    long long dp[len+1]={0};

    上面的行将用 0 初始化完整的数组。

    为什么要减去“0”

    语句str[i-1]将返回字符值,要将字符转换为整数,我们必须从'0'中减去它(ASCII值为48)。

    dp[i-1] 和 dp[i-2] 部分是如何工作的? 这就是通过索引访问数组元素的方式。

    【讨论】:

      【解决方案4】:
      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?
      

      它的作用是在数组dp 中的索引i 处添加整数加上在表达式中计算的索引处的整数。

      表达式(使用三元运算符i-2&lt;0?0:i-2 将评估为好像i-2 小于0,则值为0,否则值为@ 987654336@.

      【讨论】:

        猜你喜欢
        • 2011-10-13
        • 2019-04-18
        • 1970-01-01
        • 2020-11-02
        • 2010-11-12
        • 2012-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多