0

タスクは、すべての連続サブセットを見つけることです。または、サブセットが正と負の整数の両方を含むことができる特定の合計を持つ部分配列をより適切に言うと、サブセットを見つけることです。 1 は次のとおりです。

{1}
{1,-1,1}
{1}
{1,-1,1,-1,1}
{1,-1,1}
{1}

つまり、合計が 1 の 6 つのサブセットがあることを意味します...以前の合計を保存して試してみましたが、まだ 2 つのループを使用して実行することしかできません.1 つは 0 から n、もう 1 つは 0 から i-1 です。コード:

  for (i = 0; i < n; i++)
  {
      scanf("%d", &a1[i]); 
      sum[i] = a1[i] + a1[i - 1];
  }

  sum[0] = INT_MAX;
  for (i = 0; i < n; i++)
  {
      if (a1[i] == 1 || a1[i] == -1)
      {
          count++;
      }

      if (i > 0)
      {
          if (sum[i] == 1 || sum[i] == -1)
          {
              count++;
          }

          for (j = 0; j < i - 1; j++)
          {
              if ((sum[i - 1 - j] + a1[i] == 1) || (sum[i - 1 - j] + a1[i]) == -1)
              {
                  count++;
              }

              sum[i - 1 - j] += a1[i];
          }
      }
  }

O(n) または O(nlogn) 時間の複雑さでそれを行う方法はありますか?

4

2 に答える 2