您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: