博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FZU 1977 Pandora adventure (插头DP)
阅读量:7041 次
发布时间:2019-06-28

本文共 2349 字,大约阅读时间需要 7 分钟。

题目链接:

题意:给定一个n*m的寻宝图。有障碍、宝藏和空白点。包含所有宝藏且不包含障碍点的环有多少个?

思路:状态中增加目前有多少宝藏。所有宝藏都包含后就可以合并环了。

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define max(x,y) ((x)>(y)?(x):(y))#define min(x,y) ((x)<(y)?(x):(y))#define abs(x) ((x)>=0?(x):-(x))#define i64 long long#define u32 unsigned int#define u64 unsigned long long#define clr(x,y) memset(x,y,sizeof(x))#define CLR(x) x.clear()#define ph(x) push(x)#define pb(x) push_back(x)#define Len(x) x.length()#define SZ(x) x.size()#define PI acos(-1.0)#define sqr(x) ((x)*(x))#define FOR0(i,x) for(i=0;i
=0;i--)#define FORL1(i,a) for(i=a;i>=1;i--)#define FORL(i,a,b)for(i=a;i>=b;i--)#define rush() int CC; for(scanf("%d",&CC);CC--;)#define Rush(n) while(scanf("%d",&n)!=-1)using namespace std;void RD(int &x){scanf("%d",&x);}void RD(i64 &x){scanf("%lld",&x);}void RD(u32 &x){scanf("%u",&x);}void RD(double &x){scanf("%lf",&x);}void RD(int &x,int &y){scanf("%d%d",&x,&y);}void RD(u32 &x,u32 &y){scanf("%u%u",&x,&y);}void RD(double &x,double &y){scanf("%lf%lf",&x,&y);}void RD(int &x,int &y,int &z){scanf("%d%d%d",&x,&y,&z);}void RD(u32 &x,u32 &y,u32 &z){scanf("%u%u%u",&x,&y,&z);}void RD(double &x,double &y,double &z){scanf("%lf%lf%lf",&x,&y,&z);}void RD(char &x){x=getchar();}void RD(char *s){scanf("%s",s);}void RD(string &s){cin>>s;}void PR(int x) {printf("%d\n",x);}void PR(i64 x) {printf("%lld\n",x);}void PR(u32 x) {printf("%u\n",x);}void PR(double x) {printf("%.4lf\n",x);}void PR(char x) {printf("%c\n",x);}void PR(char *x) {printf("%s\n",x);}void PR(string x) {cout<
<
>=8; int i; FORL0(i,m) code[i]=st&7,st>>=3;}i64 encode(int code[],int m){ i64 ans=0; int hash[15],i,cnt=1; clr(hash,-1); hash[0]=0; FOR0(i,m+1) { if(hash[code[i]]==-1) hash[code[i]]=cnt++; code[i]=hash[code[i]]; ans=(ans<<3)|code[i]; } ans=(ans<<8)|Num; return ans;}int sum;void update1(int i,int j){ int x,y,k,t,q=j==m?m-1:m; i64 c; FOR0(k,dp[pre].e) { decode(code,m,dp[pre].state[k]); c=dp[pre].cnt[k]; if(s[i][j]==2) Num++; x=code[j-1]; y=code[j]; if(x&&y) { if(x!=y) { code[j-1]=code[j]=0; FOR0(t,m+1) if(code[t]==y) code[t]=x; dp[cur].push(encode(code,q),c); } else if(Num==sum) { code[j-1]=code[j]=0; if(encode(code,q)==sum) ans+=c; } } else if(x||y) { if(i

  

转载地址:http://pyxal.baihongyu.com/

你可能感兴趣的文章
华为NE40 V800 XPL功能初体验
查看>>
thinkphp3.1随机取数据库中几条记录
查看>>
设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,
查看>>
ORA-01652 even though there is sufficient space in RECYCLE BIN
查看>>
Could not use /usr/local/apache/logs/slowquery.log for logging (error 13).
查看>>
mogilefs-企业级分布式存储应用与实战
查看>>
nginx改tengine,gitlab重装操作步骤
查看>>
spring中的相互引用问题
查看>>
sql server2005 jdbc解决自动增长列统一处理问题
查看>>
GLUT and OpenGL Utility Libraries
查看>>
虚拟机安装oracle RAC
查看>>
socket client deamon
查看>>
docker images 保存导入导出、容器导入导出
查看>>
OpenSSH后门获取root密码
查看>>
说说sftp的chroot
查看>>
Network File System
查看>>
Java导致登录UCS Manager异常
查看>>
获取的一个网页木马分析
查看>>
基于PIX525的NAT配置
查看>>
grub的安装
查看>>