Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define task "GRAPH"
- #include <iostream>
- #include <cstdio>
- using namespace std;
- using ll = long long;
- using ld = long double;
- constexpr int N = 2e3 + 5;
- constexpr int mod = 1e9 + 7;
- int a[N], n, b;
- int dp[N][N], g[N][N];
- void Read()
- {
- cin >> n >> b;
- for (int i = 1; i <= n; ++i)
- cin >> a[i];
- }
- void Sub_3()
- {
- dp[n + 1][0] = 1;
- for (int i = n; i; --i)
- for (int j = 0; j <= n - i + 1; ++j)
- {
- if (a[i] == -1)
- {
- for (int t = 0; t <= i - 1; ++t)
- if (j >= (t > 0) && t + j - (t > 0) <= b)
- (dp[i][j] += dp[i + 1][j - (t > 0)]) %= mod;
- }
- else
- {
- if (j >= (a[i] > 0) && a[i] + j - (a[i] > 0) <= b)
- (dp[i][j] += dp[i + 1][j - (a[i] > 0)]) %= mod;
- }
- g[i][j] = ((j == 0 ? 0 : g[i][j - 1]) + dp[i][j]) % mod;
- }
- int ans(0);
- for (int i = 0; i <= n; ++i)
- (ans += dp[1][i]) %= mod;
- cout << (ans + mod) % mod;
- }
- void Solve()
- {
- dp[n + 1][0] = 1;
- for (int i = n; i; --i)
- {
- for (int j = 0; j <= n - i + 1 && j <= b; ++j)
- {
- if (a[i] == -1)
- {
- int t = min(i - 1, b);
- if (j == 0)
- t = min(t, 0);
- else if (j == b)
- t = min(t, 1);
- else
- t = min(t, b - j + 1);
- //for (int t = 0; t <= i - 1 && j >= (t > 0) && t + j - (t > 0) <= b; ++t)
- // (dp[i][j] += dp[i + 1][j - (t > 0)]) %= mod;
- dp[i][j] = (dp[i + 1][j] + 1ll * dp[i + 1][j - 1] * t % mod) % mod;
- }
- else
- {
- if (j >= (a[i] > 0) && a[i] + j - (a[i] > 0) <= b)
- (dp[i][j] += dp[i + 1][j - (a[i] > 0)]) %= mod;
- }
- }
- for (int j = 0; j <= n; ++j)
- g[i][j] = ((j == 0 ? 0 : g[i][j - 1]) + dp[i][j]) % mod;
- }
- int ans(0);
- for (int i = 0; i <= n; ++i)
- (ans += dp[1][i]) %= mod;
- cout << (ans + mod) % mod;
- }
- int32_t main()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- if (fopen(task ".INP", "r"))
- {
- freopen(task ".INP", "r", stdin);
- freopen(task ".OUT", "w", stdout);
- }
- Read();
- Solve();
- }
Add Comment
Please, Sign In to add comment