POJ 4901 The Romantic Hero DP
2014-08-02 11:56
381 查看
//890MS 12388K #include <cstdio> #include <iostream> #include <cstring> using namespace std; typedef long long ll; const int maxa = 1024; const int maxn = 1000; const int mod = int(1e9) + 7; int f[maxn+5][maxa], g[maxn+5][maxa], h[maxn+5][maxa]; inline void add_it(int& a, int b){ a = (a + b) % mod; } int main() { int a[maxn],T,n; short i,j,t; int ans; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=1; i<=n; i++) scanf("%d",&a[i]); memset(f, 0, sizeof(f)); memset(g, 0, sizeof(g)); memset(h, 0, sizeof(h)); f[1][a[1]]=1; for(i=2; i<=n-1; i++) { f[i][a[i]]++;///单独一个元素的集合的情况 for(j=0; j<maxa; j++) { if(f[i-1][j]) { add_it(f[i][j], f[i-1][j]); t=j^a[i]; add_it(f[i][t], f[i-1][j]); } } } g [a ]=1; h [a ]=1; for(i=n-1; i>=2; i--) { g[i][a[i]]++; h[i][a[i]]++; for(j=0; j<maxa; j++) { if(h[i+1][j]) { add_it(h[i][j], h[i+1][j]); t=j&a[i]; add_it(h[i][t], h[i+1][j]); add_it(g[i][t], h[i+1][j]); } } } ans=0; for(i=1; i<=n-1; i++) for(j=0; j<maxa; j++) { if(f[i][j]&&g[i+1][j]) { add_it(ans, ((ll)f[i][j] * g[i+1][j]) % mod); } } printf("%d\n",ans); } return 0; }
//WA #include <cstdio> #include <iostream> #include <cstring> using namespace std; typedef long long ll; const int max_n = 1000 + 5; const int max_a = 1024 + 5; const int mod = int(1e9) + 7; int a[max_n]; int dp1[max_n][max_a], dp2[max_n][max_a], dp3[max_n][max_a]; int n; inline void add_it(int& a, int b){ a = (a + b) % mod; } /*void DP1(){ memset(dp1, 0, sizeof(dp1)); //dp1[1][0] = 1; //dp1[1][a[1]] = 1; //dp1[0][0] = 1; //dp1[0][0] = 1; //dp1[1][a[1]] = 1; for(int i=1; i<=n-1; i++){ dp1[i][a[i]]++; for(int j=0; j<=1023; j++){ if(dp1[i][j]){ dp1[i+1][j] = (dp1[i+1][j] + dp1[i][j]) % mod; int jj = j^a[i+1]; dp1[i+1][jj] = (dp1[i+1][jj] + dp1[i][j]) % mod; } } }; //for(int i=1; i<=n; i++) dp1[i][0]--; }*/ void DP1(){ memset(dp1, 0, sizeof(dp1)); dp1[1][a[1]] = 1; for(int i=2; i<=n-1; i++){ dp1[i][a[i]]++; for(int j=0; j<1024; j++){ if(dp1[i-1][j]){ add_it(dp1[i][j], dp1[i-1][j]); int t = j^a[i]; add_it(dp1[i][t], dp1[i-1][j]); } } } } /*void DP2(){ memset(dp2, 0, sizeof(dp2)); memset(dp3, 0, sizeof(dp3)); //dp2 [0] = 1; //dp3 [a ] = 1; for(int i=n; i>=2; i--){ dp3[i][a[i]]++; for(int j=0; j<=1023; j++){ if(dp2[i][j]){ dp3[i-1][j&a[i-1]] = (dp3[i-1][j&a[i-1]] + dp2[i][j]) % mod; dp2[i-1][j] = (dp2[i-1][j] + dp2[i][j]) % mod; } if(dp3[i][j]){ dp3[i-1][j&a[i-1]] = (dp3[i-1][j&a[i-1]] + dp3[i][j]) % mod; dp2[i-1][j] = (dp2[i-1][j] + dp3[i][j]) % mod; } } } dp3[1][a[1]]++; }*/ void DP2(){ memset(dp2, 0, sizeof(dp2)); memset(dp3, 0, sizeof(dp3)); dp2 [a ] = 1; dp3 [a ] = 1; for(int i=n-1; i>=2; i--){ dp2[i][a[i]]++; dp3[i][a[i]]++; for(int j=0; j<1024; j++){ if(dp2[i+1][j]){ add_it(dp2[i][j], dp2[i+1][j]); int t = j & a[i]; add_it(dp2[i][t], dp2[i+1][j]); add_it(dp3[i][t], dp2[i+1][j]); } } } } int main(){ int T; scanf("%d", &T); while(T--){ scanf("%d", &n); for(int i=1; i<=n; i++) scanf("%d", &a[i]); //for(int i=1; i<=n; i++) b[i] = a[n+1-i]; DP1(); DP2(); int res = 0; for(int i=1; i<=n-1; i++){ for(int j=0; j<=1023; j++){ if(dp1[i][j] && dp3[i+1][j]) res = (res + (ll)(dp1[i][j] * dp3[i+1][j]) % mod) % mod; } } printf("%d\n", res); } return 0; }
相关文章推荐
- 2014多校第四场1005 || HDU 4901 The Romantic Hero (DP)
- hdoj The Romantic Hero 4901 (DP 位运算) 好题
- 多校第四场 hdoj 4901 The Romantic Hero DP hdoj 4902 Nice boat 线段树
- HDU 4901 The Romantic Hero DP(计数)
- 【HDU 4901 多校联合】The Romantic Hero【DP】
- HDU 4901 The Romantic Hero 简单DP
- HDOJ 4901 - The Romantic Hero 简单dp
- HDU 4901 The Romantic Hero 计数DP
- HDU 4901 - The Romantic Hero
- 【HDU】4901 The Romantic Hero 01背包
- HDU 4901 The Romantic Hero
- hdu 4901 The Romantic Hero
- HDU 4901 The Romantic Hero
- hdu 4901 The Romantic Hero--2014 Multi-University Training Contest 4
- hdu 4901——The Romantic Hero
- HDU 4901 The Romantic Hero
- HDU4901 The Romantic Hero 计数DP
- HDU-4901-The Romantic Hero
- hdu 4901 The Romantic Hero
- HDOJ 4901 The Romantic Hero