HDU 4403 A very hard Aoshu problem

暴力$dfs$。

先看数据范围,字符串最长只有$15$,也就是说枚举每个字符后面是否放置“$+$”号的复杂度为${2^{15}}$。

每次枚举到一种情况,看哪些位置能放“$=$”号,每个位置都试一下,然后判断一下是否可行。 最坏复杂度$O({2^{15}}*{15^2})$,事实上是达不到最坏复杂度的。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-8;

char s[20];
int f[20],Ans,len;

bool check()
{
    LL ans[2]; ans[0]=0; ans[1]=0;
    int g=0; LL num=0;
    for(int i=0;i<len;i++)
    {
        num=num*10+s[i]-'0';
        if(f[i]==0) continue;
        else if(f[i]==1) ans[g]=ans[g]+num, num=0;
        else if(f[i]==2) ans[g]=ans[g]+num, num=0, g=1;
    }
    ans[1]=ans[1]+num;
    if(ans[0]==ans[1]) return 1;
    return 0;
}

void dfs(int x)
{
    if(x==len)
    {
        if(f[len-1]==1) return;
        for(int i=0;i<len-1;i++)
        {
            if(f[i]==0)
            {
                f[i]=2;
                if(check()) Ans++;
                f[i]=0;
            }
        }
        return;
    }
    f[x]=0; dfs(x+1);
    f[x]=1; dfs(x+1);
}

int main()
{
    while(~scanf("%s",s))
    {
        if(s[0]=='E') break;
        len=strlen(s);
        memset(f,Ans=0,sizeof f);
        dfs(0);
        printf("%d\n",Ans);
    }
    return 0;
}

 

posted @ 2016-08-31 08:39  Fighting_Heart  阅读(128)  评论(0编辑  收藏  举报