现在的位置: 首页 > 综合 > 正文

HDU 4901 The Romantic Hero 简单DP

2018年04月24日 ⁄ 综合 ⁄ 共 1417字 ⁄ 字号 评论关闭

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4901

题意:不说了。

思路:也不说了。

把文章置顶就是想告诉自己不要脑残,不要手残,做题时要保持冷静。

改了一个1变成0以后就AC了。

代码:

#include <cmath>
#include <map>
#include <cstdlib>
#include <queue>
#include <stack>
#include <vector>
#include <ctype.h>
#include <algorithm>
#include <string>
#include <set>
#define PI acos(-1.0)
#define maxn 10005
#define INF 0x7fffffff
#define eps 1e-8
typedef __int64 LL;
typedef unsigned long long ULL;
using namespace std;
LL MOD=1000000007;
int aa[1155];
LL dp1[1155][1155];
LL dp2[1155][1155];
LL dp3[1155][1155];
LL dp4[1155][1155];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        memset(dp1,0,sizeof(dp1));
        memset(dp2,0,sizeof(dp2));
        memset(dp3,0,sizeof(dp3));
        memset(dp4,0,sizeof(dp4));
        int tot;
        scanf("%d",&tot);
        for(int i=0; i<tot; i++)
            scanf("%d",&aa[i]);
        if(tot<=1)
            printf("0\n");
        else
        {
            dp1[0][aa[0]]=1;
            for(int i=1; i<tot; i++)
            {
                for(int j=0; j<1024; j++)
                {
                    dp2[i][j]+=((dp1[i-1][j]+dp2[i-1][j])%MOD);
                    int t=aa[i]^j;
                    dp1[i][t]+=dp1[i-1][j];
                    dp1[i][t]%=MOD;
                    dp1[i][t]+=dp2[i-1][j];
                    dp1[i][t]%=MOD;
                }
                dp1[i][aa[i]]++;
                dp1[i][aa[i]]%=MOD;
            }
            dp3[tot-1][aa[tot-1]]=1;
            for(int i=tot-2; i>=0; i--)
            {
                for(int j=0; j<1024; j++)//就是这里,循环我写成了从1开始
                {
                    dp4[i][j]+=((dp3[i+1][j]+dp4[i+1][j])%MOD);
                    int t=aa[i]&j;
                    dp3[i][t]+=dp3[i+1][j];
                    dp3[i][t]%=MOD;
                    dp3[i][t]+=dp4[i+1][j];
                    dp3[i][t]%=MOD;
                }
                dp3[i][aa[i]]++;
                dp3[i][aa[i]]%=MOD;
            }
            LL ans=0;
            for(int i=0; i<tot-1; i++)
            {
                    for(int j=0; j<1024; j++)
                    {
                        if(dp1[i][j]>0&&dp3[i+1][j]+dp4[i][j]>0)
                        ans+=(dp1[i][j]*dp3[i+1][j]+dp1[i][j]*dp4[i+1][j]);
                        ans%=MOD;
                    }
            }
            printf("%I64d\n",ans);
        }
    }
    return 0;
}

抱歉!评论已关闭.