hdu 5937

Posted 罚时自动机

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 5937相关的知识,希望对你有一定的参考价值。

题意:给出1-9的个数,然后组成a+b=c的式子(1<=a,b,c<=9),这样的式子有多少个?

算一下,有36个,满36个需要用到的ai的个数是17-i,先判满不满,num[i]=min(num[i],17-i),多于限制个没什么用,然后真的只要爆搜就行了,不敢相信自己的眼睛

#include<bits/stdc++.h>
using namespace std;
const int maxn=500;
int a[10],ans;
int d[36][3];

map<int,int> vis;
void init(){
    int cnt=0;
    for(int i=1;i<9;i++)
    for(int j=1;j+i<10;j++){
        d[cnt][0]=i;
        d[cnt][1]=j;
        d[cnt][2]=i+j;
        vis[i]++;vis[j]++;vis[i+j]++;
        cnt++;
    }
    //printf("%d\n",cnt);
    //for(int i=1;i<=9;i++)cout<<i<<" "<<vis[i]<<endl;
}

inline bool judge(int p){
    if(a[d[p][0]]>=0&&a[d[p][1]]>=0&&a[d[p][2]]>=0)return true;
    return false;
}

inline void ss(int p,int val){
    a[d[p][0]]+=val;a[d[p][1]]+=val;a[d[p][2]]+=val;
}

void dfs(int dep,int now,int sz){
    if(36-dep+now<=ans||dep>=36)return ;
    ss(dep,-1);
    if(judge(dep)){
        ans=max(ans,now+1);
        dfs(dep+1,now+1,sz-3);
    }
    ss(dep,1);
    dfs(dep+1,now,sz);
}

int main(){
    init();
    int t,cas=1,cnt;
    scanf("%d",&t);
    while(t--){
        cnt=0;bool ok=1;
        for(int i=1;i<=9;i++){
            scanf("%d",a+i);
            a[i]=min(a[i],17-i);
            if(a[i]<17-i)ok=0;
            cnt+=a[i];
        }
        if(ok)ans=36;
        else{
            ans=0;
            dfs(0,0,cnt);
        }
        printf("Case #%d: %d\n",cas++,ans);
    }
    return 0;
}

 

以上是关于hdu 5937的主要内容,如果未能解决你的问题,请参考以下文章

HDU 5937 Equation

[暴力][贪心]JZOJ 5937 斩杀计划

HDU4057 Rescue the Rabbit(AC自动机+状压DP)

HDU3247 Resource Archiver(AC自动机+BFS+DP)

POJ - 2778 ~ HDU - 2243 AC自动机+矩阵快速幂

微信小程序代码片段