线性DP。
dp[i][j]表示以第i个数字为结尾的,字串和为j的有几种。
#include#include #include #include 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;}