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的主要内容,如果未能解决你的问题,请参考以下文章
HDU4057 Rescue the Rabbit(AC自动机+状压DP)
HDU3247 Resource Archiver(AC自动机+BFS+DP)