根本想不到的动态规划问题,以水管的序数作为第一维(很常规),但是以当前进出水的总和作为第二维!我原本以为是区间DP,想想时间复杂度不够就以为不是DP了,没想到居然是这样的QAQ。
#include <bits/stdc++.h>
using namespace std;
const int N = 1010, M = 20010, MOD = 1e9 + 7, B = 10000;
int n;
int w[N];
int f[N][M];
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; ++ i)
scanf("%d", &w[i]);
int ans = 0;
for (int i = 1; i <= n; ++ i)
{
for (int j = 0; j < M; ++ j)
{
if (j + w[i] < M)
f[i][j] = (f[i][j] + f[i - 1][j + w[i]]) % MOD; // 前面存在连续水管,且i口放水
if (j - w[i] >= 0)
f[i][j] = (f[i][j] + f[i - 1][j - w[i]]) % MOD; // 前面存在连续水管,且i口吸水
}
f[i][B + w[i]] = (f[i][B + w[i]] + 1) % MOD; // 前面无连续水管,且i口放水
f[i][B - w[i]] = (f[i][B - w[i]] + 1) % MOD; // 前面无连续水管,且i口吸水
ans = (ans + f[i][B]) % MOD;
}
cout << ans << endl;
return 0;
}