#include<bits/stdc++.h> using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(0); int n; long long m = 1000000007; cin >> n; vector<long long> num(n+1); for(int i=1; i<=n; i++) cin >> num[i]; long long sumofnums=0; for(int i=1; i<=n; i++) sumofnums+=num[i]; if(sumofnums<1000000007) { for(int i=1; i<=n; i++) num[i]%=2; bool streak=false; int counter=0; for(int i=1; i<=n; i++) { if(num[i]==0 && streak) continue; if(num[i]==0 && !streak) ++counter; if(num[i]==1 && streak) { streak=false; ++counter; continue; } if(num[i]==1 && !streak) streak=true; } if(streak) { cout << 0 << "\n"; return 0; } --counter; long long output=1; for(int i=0; i<counter; ++i) { output*=2; output%=m; } cout << output << "\n"; return 0; } vector<vector<vector<long long>>> dp(n+1, vector<vector<long long>> (n+1, vector<long long> (2))); vector<long long> P(n+1); vector<long long> sum(n+1); for(int i=1; i<=n; i++) { sum[i]=(sum[i-1]+num[i]); } P[0]=1; for(int i=1; i<=n; i++) { if((num[i]%m)%2==1) dp[i][1][1]=P[i-1]; else dp[i][1][0]=P[i-1]; P[i]=dp[i][1][0]; for(int j=2; j<=i; j++) { if((((sum[i]-sum[i-j])%m)%2)==1) { dp[i][j][1]=max(dp[i-1][j-1][0], dp[i-1][j-1][1]); }else{ dp[i][j][0]=max(dp[i-1][j-1][0], dp[i-1][j-1][1]); P[i]+=dp[i][j][0]; P[i]%=m; } } } cout << P[n] << "\n"; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | #include<bits/stdc++.h> using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(0); int n; long long m = 1000000007; cin >> n; vector<long long> num(n+1); for(int i=1; i<=n; i++) cin >> num[i]; long long sumofnums=0; for(int i=1; i<=n; i++) sumofnums+=num[i]; if(sumofnums<1000000007) { for(int i=1; i<=n; i++) num[i]%=2; bool streak=false; int counter=0; for(int i=1; i<=n; i++) { if(num[i]==0 && streak) continue; if(num[i]==0 && !streak) ++counter; if(num[i]==1 && streak) { streak=false; ++counter; continue; } if(num[i]==1 && !streak) streak=true; } if(streak) { cout << 0 << "\n"; return 0; } --counter; long long output=1; for(int i=0; i<counter; ++i) { output*=2; output%=m; } cout << output << "\n"; return 0; } vector<vector<vector<long long>>> dp(n+1, vector<vector<long long>> (n+1, vector<long long> (2))); vector<long long> P(n+1); vector<long long> sum(n+1); for(int i=1; i<=n; i++) { sum[i]=(sum[i-1]+num[i]); } P[0]=1; for(int i=1; i<=n; i++) { if((num[i]%m)%2==1) dp[i][1][1]=P[i-1]; else dp[i][1][0]=P[i-1]; P[i]=dp[i][1][0]; for(int j=2; j<=i; j++) { if((((sum[i]-sum[i-j])%m)%2)==1) { dp[i][j][1]=max(dp[i-1][j-1][0], dp[i-1][j-1][1]); }else{ dp[i][j][0]=max(dp[i-1][j-1][0], dp[i-1][j-1][1]); P[i]+=dp[i][j][0]; P[i]%=m; } } } cout << P[n] << "\n"; return 0; } |