CodeForces 383D Antimatter

时间:2022-02-23 11:18:50

线性DP。

dp[i][j]表示以第i个数字为结尾的,字串和为j的有几种。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std; const long long mod=1e9+;
const int f=;
const int maxn=+;
int n,a[maxn];
long long dp[maxn][*maxn]; int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]); memset(dp,,sizeof dp); for(int i=;i<=n;i++)
{
for(int j=-f;j<=f;j++)
{
if(j-a[i]>=-f&&j-a[i]<=f)
dp[i][j+f]=(dp[i][j+f]+dp[i-][j-a[i]+f])%mod;
if(j+a[i]>=-f&&j+a[i]<=f)
dp[i][j+f]=(dp[i][j+f]+dp[i-][j+a[i]+f])%mod;
}
dp[i][a[i]+f]++;
dp[i][-a[i]+f]++;
} long long ans=;
for(int i=;i<=n;i++) ans=(ans+dp[i][f])%mod;
printf("%lld\n",ans); return ;
}