洛谷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 题意: 数独的分数如下.一个数独的总分数就是权值乘所填数字之和. 现在给一个未完成的数独,问分数最高的数独 ...
随机推荐
- Java基础教程:面向对象编程[2]
Java基础教程:面向对象编程[2] 内容大纲 访问修饰符 四种访问修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java 支持 4 种不同的访问权限. default ...
- UVA10294 Arif in Dhaka (First Love Part 2) —— 置换、poyla定理
题目链接:https://vjudge.net/problem/UVA-10294 题解: 白书P146~147. 为什么旋转i个间距,就有gcd(i,n)个循环,且每个循环有n/gcd(i,n)个元 ...
- Java接口 详解(二)
上一篇Java接口 详解(一)讲到了接口的基本概念.接口的使用和接口的实际应用(标准定义).我们接着来讲. 一.接口的应用—工厂设计模式(Factory) 我们先看一个范例: package com. ...
- 浅析android中的依赖注入
这几年针对Android推出了不少View注入框架,例如ButterKnife.我们首先来了解一下使用这些框架有什么好处,其实好处很明显:它可以减少大量的findViewById以及setOnClic ...
- 分享知识-快乐自己:微服务的注册与发现(基于Eureka)
1):微服务架构 服务提供者.服务消费者.服务发现组件这三者之间的关系: 各个微服务在启动时,将自己的网络地址等信息注册到服务发现组件中,服务发现组件会存储这些信息. 服务消费者可从服务发现组件查询服 ...
- spring与jdbc整合
spring+jdbc开发,我使用的是c3p0连接池 1.数据库建表: create table person( id int primary key auto_increment, name var ...
- STL容器特征总结与迭代器失效
Vector 内部数据结构:连续存储,例如数组. 随机访问每个元素,所需要的时间为常量. 在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化. 可动态增 ...
- python之系统编程 --线程
###########使用线程完成多任务################ from threading import Thread import time #1. 如果多个线程执行的都是同一个函数的话 ...
- 「UVA11181」 Probability|Given(概率
题意翻译 有n个人要去买东西,他们去买东西的概率为p[i]. 现在得知有r个人买了东西,在这种条件下,求每个人买东西的概率. 感谢@s_r_f 提供翻译 题目描述 PDF 输入输出格式 输入格式: 输 ...
- jmeter 开发自己的java请求 二次开发
package test; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient. ...