线性DP。
dp[i][j]表示以第i个数字为结尾的,字串和为j的有几种。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const long long mod=1e9+7; const int f=10000; const int maxn=1000+10; int n,a[maxn]; long long dp[maxn][20*maxn]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); memset(dp,0,sizeof dp); for(int i=1;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-1][j-a[i]+f])%mod; if(j+a[i]>=-f&&j+a[i]<=f) dp[i][j+f]=(dp[i][j+f]+dp[i-1][j+a[i]+f])%mod; } dp[i][a[i]+f]++; dp[i][-a[i]+f]++; } long long ans=0; for(int i=1;i<=n;i++) ans=(ans+dp[i][f])%mod; printf("%lld\n",ans); return 0; }