这两种枚举方式有什么区别
查看原帖
这两种枚举方式有什么区别
306734
phil071128楼主2023/4/17 16:31

倒序

  // a, b 下标均从 1 开始
  for (int i = A + 1; i>=1; --i)
    for (int j = B + 1; j>=1; --j) {
      if (i > A && j > B) continue;
      if ((i + j) & 1) {
        if (i > A)
          f[i][j] = f[i][j + 1];
        else if (j > B)
          f[i][j] = f[i + 1][j];
        else
          f[i][j] = std::min(f[i + 1][j], f[i][j + 1]);
      } else {
        if (i > A)
          f[i][j] = f[i][j + 1] + b[j];
        else if (j > B)
          f[i][j] = f[i + 1][j] + a[i];
        else
          f[i][j] = std::max(f[i + 1][j] + a[i], f[i][j + 1] + b[j]);
      }
    }
  return f[1][1];
}

正序

  // a, b 下标均从 1 开始
  for (int i = 0; i<=n; i++) 
    for (int j = 0; j<=m; j++) {
      if (i==0&&j==0) continue;
      if ((i + j) & 1) {
        if (i<1)
          f[i][j] = f[i][j - 1];
        else if (j<1)
          f[i][j] = f[i - 1][j];
        else
          f[i][j] = std::min(f[i - 1][j], f[i][j - 1]);
      } else {
        if (i <1)
          f[i][j] = f[i][j - 1] + b[j];
        else if (j <1)
          f[i][j] = f[i -1 ][j] + a[i];
        else
          f[i][j] = std::max(f[i - 1][j] + a[i], f[i][j- 1] + b[j]);
      }
    }
  return f[n][m];
}
2023/4/17 16:31
加载中...