Problem p03172 (C++)

Buggy submission (status: Runtime Error):

// WA

#include <bits/stdc++.h>

using namespace std;

typedef long long int ll;

int dp[100001];
vector<int> ar(100);

// ll solve(ll index, ll x) {
//     // cout << "0\n";
//     if(dp[index][x] != -1)
//         return dp[index][x];
//     ll ansl = 0;
//     // cout << "1\n";
//     if(x == 0)
//         return dp[index][x] = 1;
//     // cout << "2\n";
//     if(index == 0) {
//         if(ar[0] >= x)
//             return dp[index][x] = 1;
//         else return dp[index][x] = 0;
//     }
//     // cout << "3\n";
//     for(int i = 0; i <= min(ar[index], x); i++) {
//         ansl = (ansl + solve(index-1, x-i)) % 1000000007;
//     }
//     // cout << "ansl = " << "\n";
//     return dp[index][x] = ansl;
// }

void sub(int &a, int b) {
  a -= b;
  if (a < 0)
    a += 1000000007;
}

void add(int &a, int b) {
  a += b;
  if (a >= 1000000007)
    a -= 1000000007;
}

ll solve_bottom_up(int n, int k) {
  dp[0] = 1;
  for (int child = 0; child < n; child++) {
    vector<int> pf(k + 1, 0);
    for (int used = k; used >= 0; used--) {
      int l = used + 1;
      int r = used + min(ar[child], k - used);
      add(pf[l], dp[used]);
      if (r + 1 <= k)
        sub(pf[r + 1], dp[used]);
    }
    int prf_sum = 0;
    for (int i = 0; i <= k; i++) {
      add(prf_sum, pf[i]);
      add(dp[i], prf_sum);
    }
  }
  return dp[k];
}

int main() {
  int n, k;
  cin >> n >> k;
  for (int i = 0; i < n; i++)
    cin >> ar[i];
  // for(int i = 0; i < n; i++) {
  //     for(int j = 0; j <= k; j++)
  //         dp[i][j] = -1;
  // }
  cout << solve_bottom_up(n, k) << "\n";
  // for(int i = 0; i < n; i++) {
  //     for(int j = 0; j <= k; j++)
  //         cout << dp[i][j] << " ";
  //     cout << "\n";
  // }
}

Fixed submission:

// WA

#include <bits/stdc++.h>

using namespace std;

typedef long long int ll;

int dp[100001];
vector<int> ar(100);

// ll solve(ll index, ll x) {
//     // cout << "0\n";
//     if(dp[index][x] != -1)
//         return dp[index][x];
//     ll ansl = 0;
//     // cout << "1\n";
//     if(x == 0)
//         return dp[index][x] = 1;
//     // cout << "2\n";
//     if(index == 0) {
//         if(ar[0] >= x)
//             return dp[index][x] = 1;
//         else return dp[index][x] = 0;
//     }
//     // cout << "3\n";
//     for(int i = 0; i <= min(ar[index], x); i++) {
//         ansl = (ansl + solve(index-1, x-i)) % 1000000007;
//     }
//     // cout << "ansl = " << "\n";
//     return dp[index][x] = ansl;
// }

void sub(int &a, int b) {
  a -= b;
  if (a < 0)
    a += 1000000007;
}

void add(int &a, int b) {
  a += b;
  if (a >= 1000000007)
    a -= 1000000007;
}

ll solve_bottom_up(int n, int k) {
  dp[0] = 1;
  for (int child = 0; child < n; child++) {
    vector<int> pf(k + 1, 0);
    for (int used = k; used >= 0; used--) {
      int l = used + 1;
      int r = used + min(ar[child], k - used);
      if (l <= r) {
        add(pf[l], dp[used]);
        if (r + 1 <= k)
          sub(pf[r + 1], dp[used]);
      }
    }
    int prf_sum = 0;
    for (int i = 0; i <= k; i++) {
      add(prf_sum, pf[i]);
      add(dp[i], prf_sum);
    }
  }
  return dp[k];
}

int main() {
  int n, k;
  cin >> n >> k;
  for (int i = 0; i < n; i++)
    cin >> ar[i];
  // for(int i = 0; i < n; i++) {
  //     for(int j = 0; j <= k; j++)
  //         dp[i][j] = -1;
  // }
  cout << solve_bottom_up(n, k) << "\n";
  // for(int i = 0; i < n; i++) {
  //     for(int j = 0; j <= k; j++)
  //         cout << dp[i][j] << " ";
  //     cout << "\n";
  // }
}