码迷,mamicode.com
首页 > 其他好文 > 详细

codeforces 383D

时间:2019-03-03 16:08:07      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:子序列   open   alt   display   sizeof   pac   color   style   gif   

题意:

给你一个长为n的正整数数组,你要选一个连续子序列,对其每个元素加上正号或者负号,使其和为0,求方案数

题解:

dp( i , j , k )表示dp到第i个,和为j,这个元素是选了正还是负

滚动数组优化

技术图片
 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define maxn 1005
 4 #define maxm 10005
 5 using namespace std;
 6 const ll mod = 1000000007;
 7 int n,a[maxn];
 8 ll dp[2][3][maxm*2];
 9 int main()
10 {
11     scanf("%d",&n);
12     for(int i=1;i<=n;++i)scanf("%d",&a[i]);
13     ll ans=0;
14     for(int i=1;i<=n;++i)
15     {
16         int now=i&1,pre=now^1;
17         memset(dp[now],0,sizeof(dp[now]));
18         dp[now][1][10005+a[i]]=1;dp[now][2][10005-a[i]]=1;
19         for(int k=1;k<=2;++k)
20             for(int j=0;j<maxm*2;++j)if(dp[pre][k][j])
21                 {
22                     dp[now][1][j+a[i]]=(dp[now][1][j+a[i]]+dp[pre][k][j])%mod;
23                     dp[now][2][j-a[i]]=(dp[now][2][j-a[i]]+dp[pre][k][j])%mod;
24                 }
25         for(int k=1;k<=2;++k)ans=(ans+dp[i&1][k][10005])%mod;
26     }
27     printf("%I64d\n",ans);
28     return 0;
29 }
View Code

 

codeforces 383D

标签:子序列   open   alt   display   sizeof   pac   color   style   gif   

原文地址:https://www.cnblogs.com/uuzlove/p/10465970.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!