洛谷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 题意: 数独的分数如下.一个数独的总分数就是权值乘所填数字之和. 现在给一个未完成的数独,问分数最高的数独 ...
随机推荐
- LeetCode:将有序数组转换为二叉搜索树【108】
LeetCode:将有序数组转换为二叉搜索树[108] 题目描述 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差 ...
- Google IO 2019 Android 太长不看版
Google I/O 2019, 这里有个playlist是所有Android开发相关的session视频合集: Android & Play at Google I/O 2019 当然啦每个 ...
- hadoop —— MapReduce例子 (求平均值)
参考:http://eric-gcm.iteye.com/blog/1807468 math.txt: 张三 88 李四 99 王五 66 赵六 77 china.txt: 张三 78 李四 89 王 ...
- Spark- ERROR Shell: Failed to locate the winutils binary in the hadoop binary path java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
运行 mport org.apache.log4j.{Level, Logger} import org.apache.spark.rdd.RDD import org.apache.spark.{S ...
- LightOJ 1070 Algebraic Problem:矩阵快速幂 + 数学推导
题目链接:http://lightoj.com/volume_showproblem.php?problem=1070 题意: 给你a+b和ab的值,给定一个n,让你求a^n + b^n的值(MOD ...
- js图片上传及显示
html部分: <form action='' method='post' name='myform'> <input type='file' id='iptfileupload' ...
- HTML Document 头
1. 比较宽松的HTML格式,样式 <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"> 如下 ...
- Block Change Tracking (块改变跟踪)
理论背景:Block ChangeTracking 是Oracle 10g里推出的特性. Block change tracking 会记录data file里每个block的update 信息,这些 ...
- HDFS数据迁移目录到正确姿势
添加了一块硬盘,原来的DataNode已经把原有的硬盘占满:怎么办,想要把旧有的数据迁移到新的硬盘上面: 1. 在CDH中修改目录(在HDFS组件中搜索.dir),本例中,新加的硬盘挂载在/data上 ...
- XmlSerialize error: There was an error generating the XML document.
今天遇到一个很火的问题, 一个c#的class 序列化成xml后抛出异常, 信息为: XmlSerialize error: There was an error generating the XML ...