传送门

坑着,等联赛之后再填(联赛挂了就不填了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 靶形数独(跳舞链)的更多相关文章

  1. 洛谷——P1074 靶形数独

    P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z ...

  2. 洛谷P1074 靶形数独 [搜索]

    题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...

  3. [洛谷P1074] 靶形数独

    洛谷题目链接:靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博 ...

  4. 洛谷 P1074 靶形数独 Label:search 不会

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  5. 洛谷 P1074 靶形数独

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  6. [NOIP2009] 提高组 洛谷P1074 靶形数独

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  7. 洛谷 P1074 靶形数独(剪枝)

    //人生中第一道蓝题(3.5h) 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请 ...

  8. 洛谷—— P1074 靶形数独

    https://www.luogu.org/problem/show?pid=1074 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但 ...

  9. 洛谷P1074 靶形数独【dfs】【剪枝】

    题目:https://www.luogu.org/problemnew/show/P1074 题意: 数独的分数如下.一个数独的总分数就是权值乘所填数字之和. 现在给一个未完成的数独,问分数最高的数独 ...

随机推荐

  1. 剑指Offer:对称的二叉树【28】

    剑指Offer:对称的二叉树[28] 题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 题目分析 Java题解 /* publi ...

  2. C++函数模板的显示调用与隐式调用

    C++函数模板可以显示调用与可以隐式调用 首先定义函数模板: template <class T> inline const T& c_max (const T& a, c ...

  3. haproxysocket 参数记录

    haproxy的一些指标 pxname  组名 svname  服务器名 qcur    当前队列 qmax    最大队列 scur当前会话用户 smax最大会话用户 slim会话限制 stot会话 ...

  4. BZOJ 1677 [Usaco2005 Jan]Sumsets 求和:dp 无限背包 / 递推【2的幂次方之和】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1677 题意: 给定n(n <= 10^6),将n分解为2的幂次方之和,问你有多少种方 ...

  5. Tips:PowerDesigner16.5 图表显示Code以及 Columns新增Commet显示

  6. lxml解析html与元素定位

    lxml.beautifulsoup和正则表达式都可以解析定位html元素.前两者中,lxml比beautifulsoup效率高,所以采用lxml解析html. 方法: from lxml impor ...

  7. OP趋势系统

    经过3年多时间的摸索,经历过熊市牛市的历练,终于完成坚持已久的OP趋势系统的实践,接下来,我将在股灾后,每天都分享OP趋势系统的信号,可以很负责任的说,经过10年历史数据的测试,加上3年的实盘,更加坚 ...

  8. kettle导数到user_用于left join_20160928

    这篇博客主要是给mysql left join做铺垫,需要现在本地数据库创建一个users 数据表 然后去和 test_a03order表  left join 一.首先在local_db数据库先创建 ...

  9. 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心

    题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去. 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi​,地面的高度是 h_0 = 0 ...

  10. ACM学习历程—POJ1088 滑雪(dp && 记忆化搜索)

    Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...