洛谷P1074 靶形数独(跳舞链)
坑着,等联赛之后再填(联赛挂了就不填了233)
//minamoto
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,:;}
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
int score[]={,,,,,,,,,, ,,,,,,,,, ,,,,,,,,, ,,,,,,,,, ,,,,,,,,, ,,,,,,,,, ,,,,,,,,, ,,,,,,,,, ,,,,,,,,};
const int N=,mm=N*N*N*N*N*+N,mn=N*N*N+N;
int mp[][];
int ans=-,sz;
int U[mm],D[mm],L[mm],R[mm],C[mm],X[mm];
int S[mn],Q[mn],H[mn];bool v[mn];
void init(int r,int c){
//建好虚拟节点
for(int i=;i<=c;++i){
S[i]=,U[i]=D[i]=i,
L[i+]=i,R[i]=i+;
}
R[sz=c]=,L[]=sz;
while(r) H[r--]=-;//判断每列是否有节点
}
void place(int &r,int &c1,int &c2,int &c3,int &c4,int i,int j,int k){
//看不懂
r=((i-)*N+j-)*N+k;
c1=(i-)*N+j;
c2=N*N+(i-)*N+k;
c3=N*N*+(j-)*N+k;
c4=N*N*+(((i-)/)*+(j-)/)*N+k;
}
void link(int r,int c){
//S记录每列的元素个数,C是个队列,记录总的节点个数(大概)
//好像看不太懂这跳舞链怎么连的……
++S[C[++sz]=c];
X[sz]=r,D[sz]=D[c],U[D[c]]=sz,
U[sz]=c,D[c]=sz;
if(H[r]==-) H[r]=L[sz]=R[sz]=sz;//这行没有的话就都先连起来
else{
R[sz]=R[H[r]],L[R[H[r]]]=sz,
L[sz]=H[r],R[H[r]]=sz;
}
}
void remove(int c){
L[R[c]]=L[c],R[L[c]]=R[c];
for(int i=D[c];i!=c;i=D[i])
for(int j=R[i];j!=i;j=R[j])
D[U[j]]=D[j],U[D[j]]=U[j],--S[C[j]];
}
void resume(int c){
for(int i=U[c];i!=c;i=U[i])
for(int j=L[i];j!=i;j=L[j])
++S[C[D[U[j]]=U[D[j]]=j]];
L[R[c]]=R[L[c]]=c;
}
void dance(int k){
if(!R[]){
int res=;
for(int i=;i<k;++i)
res+=score[(X[Q[i]]-)/N+]*((X[Q[i]]-)%N+);
cmax(ans,res);
return;
}
int tmp=mm,c;
for(int i=R[];i;i=R[i])
if(S[i]<tmp) tmp=S[c=i];
remove(c);
for(int i=D[c];i!=c;i=D[i]){
Q[k]=i;
for(int j=R[i];j!=i;j=R[j]) remove(C[j]);
dance(k+);
for(int j=L[i];j!=i;j=L[j]) resume(C[j]);
}
resume(c);
}
int main(){
// freopen("testdata.in","r",stdin);
int r,c1,c2,c3,c4;
init(mn,N*N*);
for(int i=;i<=N;++i)
for(int j=;j<=N;++j){
mp[i][j]=read();
if(mp[i][j]){
place(r,c1,c2,c3,c4,i,j,mp[i][j]);
link(r,c1),link(r,c2),link(r,c3),link(r,c4);
v[c1]=v[c2]=v[c3]=v[c4]=;
}
}
for(int i=;i<=N;++i)
for(int j=;j<=N;++j)
for(int k=;k<=N;++k){
place(r,c1,c2,c3,c4,i,j,k);
if(v[c1]||v[c2]||v[c3]||v[c4])continue;
link(r,c1),link(r,c2),link(r,c3),link(r,c4);
}
dance();
printf("%d\n",ans);
return ;
}
洛谷P1074 靶形数独(跳舞链)的更多相关文章
- 洛谷——P1074 靶形数独
P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z ...
- 洛谷P1074 靶形数独 [搜索]
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...
- [洛谷P1074] 靶形数独
洛谷题目链接:靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博 ...
- 洛谷 P1074 靶形数独 Label:search 不会
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- 洛谷 P1074 靶形数独
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- [NOIP2009] 提高组 洛谷P1074 靶形数独
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...
- 洛谷 P1074 靶形数独(剪枝)
//人生中第一道蓝题(3.5h) 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请 ...
- 洛谷—— P1074 靶形数独
https://www.luogu.org/problem/show?pid=1074 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但 ...
- 洛谷P1074 靶形数独【dfs】【剪枝】
题目:https://www.luogu.org/problemnew/show/P1074 题意: 数独的分数如下.一个数独的总分数就是权值乘所填数字之和. 现在给一个未完成的数独,问分数最高的数独 ...
随机推荐
- 怎样避免C#中将小数转换为字符串时出现科学记数法
在C#中如果float.double.decimal类型的值,小数点后的0太多时,C#会用科学记数法来表示小数的值. 例如下面的double类型0.00009,如果我们直接将其用ToString()方 ...
- MySQL 中事务的实现
在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的: 在这篇文章中,我们将对事务的实现进行分析, ...
- freemaker开发
推荐书籍 百度云盘 密码: c3m9 1. 前言 本书为<FreeMarker 2.3.19 中文版手册>,包含了freemarker开发得方方面面,可以作为开发freemarker的字典 ...
- Zookeeper- Error contacting service. It is probably not running解决方案和原理
搭建启动Zookeeper集群出现Error contacting service. It is probably not running解决方案和原理 1.关闭防火墙 [root@srv01 bi ...
- frame标签
frame中有一个属性scrolling,可以这样设置它 <frame src="top.html" noresize scrolling="no"/&g ...
- lucene内置的评分函数
For multiterm queries, Lucene takes the Boolean model, TF/IDF, and the vector space model and combin ...
- listen 72
Warmer Temps May Bollux Botanicals Global warming might seem like a botanical boon. After all, milde ...
- linux ssh 命令使用解析
前一阵远程维护Linux服务器,使用的是SSH,传说中的secure shell. 登陆:ssh [hostname] -u user 输入密码:***** 登 陆以后就可以像控制自己的机器一样控制它 ...
- 数据结构与算法(3)----->队列和栈
1. 栈和队列的基本性质 栈是先进后出;(像是子弹夹,后进先打出) 队列是先进先出;(像是平时排队买冰淇淋,按顺序轮流) 栈和队列在实现的结构上可以有数组和链表两种形式; (1)数组结构实现容易; ( ...
- Merge into使用详解( 同时执行inserts和updates操作 )
Merge是一个非常有用的功能,类似于MySQL里的insert into on duplicate key. Oracle在9i引入了merge命令, 通过这个merge你能够在一个SQL语句中对一 ...