Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 动态规划中的表是如何工作的?_C++_String - Fatal编程技术网

C++ 动态规划中的表是如何工作的?

C++ 动态规划中的表是如何工作的?,c++,string,C++,String,我学习动态规划已经有一天了,我在一个网站上看到了一段代码。 问题是写一个函数来检查C是否是a和B的交错。如果C包含a和B的所有字符,并且保留了单个字符串中所有字符的顺序,那么C被称为是a和B的交错。我不明白的是二维矩阵中的值是如何填充的 需要帮助:) 这里是链接 //A和B的交错,否则为false。 布尔是交错的(char*A,char*B,char*C) { //求两个字符串的长度 int M=strlen(A),N=strlen(B); //让我们创建一个二维表来存储 //如果C[0..i

我学习动态规划已经有一天了,我在一个网站上看到了一段代码。 问题是写一个函数来检查C是否是a和B的交错。如果C包含a和B的所有字符,并且保留了单个字符串中所有字符的顺序,那么C被称为是a和B的交错。我不明白的是二维矩阵中的值是如何填充的

需要帮助:) 这里是链接

//A和B的交错,否则为false。
布尔是交错的(char*A,char*B,char*C)
{
//求两个字符串的长度
int M=strlen(A),N=strlen(B);
//让我们创建一个二维表来存储
//如果C[0..i+j-1],子问题C[i][j]将为真
//是A[0..i-1]和B[0..j-1]的交错。
bool-IL[M+1][N+1];
memset(IL,0,sizeof(IL));//将所有值初始化为false。
//C只能是A和B的和的交错
//A和B的长度等于C的长度。
如果((M+N)!=strlen(C))
返回false;
//处理A和B的所有字符
for(int i=0;i重新使用子问题的结果来解决问题。子问题是问题的较小版本。通常使用表格来存储子问题的结果

表中的索引是特定于应用的;在这种情况下,注释中对其进行了描述:

// Let us create a 2D table to store solutions of
// subproblems.  IL[i][j] will be true if C[0..i+j-1]
// is an interleaving of A[0..i-1] and B[0..j-1].
(我修正了一个错误,
C[I][j]
应该是原始源代码中的
IL[I][j]

子问题确定
A
B
的子串是否是C的子串的交错。IL数组中的索引确定
A
B
的子串的长度(第三个子串的长度由其他两个子串的长度表示)

例如:

  • IL[0][0]
    真的
    ,因为“”(空字符串)和“交错形成”
  • IL[0][*]
    也是
    true
    ,因为“”和
    无论什么
    交错形成
    无论什么
    (这里,
    *
    表示“任何东西”)
  • IL[*][0]
    也是
    true
    ,原因与上述类似
  • IL[i][j]
    是通过比较
    C
    中的当前字符与
    A
    B
    中的当前字符来计算的(查看源代码以确定我所说的“当前”是什么意思)
    • 如果它两者都不匹配,那么您知道
      C
      不是一个交错,因为它包含一个意外的字符。因此,
      IL[i][j]=false
    • 如果它匹配
      A
      ,那么您还需要检查前面的字符是否正确交错。这里是动态编程部分的作用——您不需要实际查看所有这些字符来检查它们,因为您在以前的迭代中已经这样做了。检查的结果(这也是您应该返回的最终结果)存储在
      IL
      表中,更具体地说,存储在
      IL[i-1][j]
      中。因此,
      IL[i][j]=IL[i-1][j]
    • 如果与
      B
      匹配,则执行与上述相同的操作,但查看
      IL[i][j-1]

如果您在理解动态规划解决方案时遇到困难,我建议您在站点上手动使用递归解决方案。最终,您会发现您正在重复许多比较。您可以通过在第一次进行比较时存储比较结果,然后重新使用该结果来避免这种重复n以后的场合。

网站链接将有助于为您的问题设置上下文。是的,当然!我已编辑了问题检查
// Let us create a 2D table to store solutions of
// subproblems.  IL[i][j] will be true if C[0..i+j-1]
// is an interleaving of A[0..i-1] and B[0..j-1].