1 条题解
-
1
#include<bits/stdc++.h> using namespace std; #define ll long long int T; int n; const int mod = 1000000007; int main() { cin >> T; while(T--) { cin >> n; vector<int> a(n + 1, 0); int ans = 0; for (int i = 1; i <= n; i++) { cin >> a[i]; ans = (ans + a[i]) % 2; } if (ans) {//总和为奇数,必然无结果 cout << 0<<endl; continue; } vector<vector<int>> dp(n + 1, vector<int>(2, 0)); //dp[j][k]:从前i个数中选取j个结果为k(0为偶奇为1)的方案数 dp[0][0] = 1; //空集结果为0即偶数,方案数为1 for (int i = 1; i <= n; i++) {//枚举前i个数 for (int j = i; j >= 1; j--) {//枚举选取的个数,降维背包内层循环倒着遍历 if (a[i] % 2 == 1) {//第i个数为奇数 //第i个数选取j个数结果为奇数 //i-1个数选取j个结果为奇数,或i-1个选取j-1个结果为偶数 dp[j][1] = (dp[j][1] + dp[j - 1][0]) % mod; //第i个选取j个数结果为偶数 //i-1个选取j个结果为偶数,或i-1个选取j-1个结果为奇数 dp[j][0] = (dp[j][0] + dp[j - 1][1]) % mod; } else {//第i个数为偶数 //第i个数选取j个数结果为奇数 //i-1个数选取j个结果为奇数,或i-1个选取j-1个结果为奇数 dp[j][1] = (dp[j][1] + dp[j - 1][1]) % mod; //第i个选取j个数结果为偶数 //i-1个选取j个结果为偶数,或i-1个选取j-1个结果为偶数 dp[j][0] = (dp[j][0] + dp[j - 1][0]) % mod; } } } ans = 0; for (int j = 0; j <= n; j++)ans = (ans + dp[j][0]) % mod; cout << ans << endl; } return 0; }
- 1
信息
- ID
- 465
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 110
- 已通过
- 25
- 上传者