都是经典题了吧。。我好无聊。。

4806

4806-1801是双倍经验。。DP方程看代码吧。。

 /* http://www.cnblogs.com/karl07/ */
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; #define ll long long
//#define P 9999973 //bzoj1801
#define P 999983 //bzoj4806
#define C(x) ((x)*(x-1)/2)
int n,m;
ll f[][][]; int main(){
scanf("%d%d",&n,&m);
f[][][]=;
for (int i=;i<=n;i++){
for (int j=;j<=m;j++){
for (int k=;k<=m-j;k++){
f[i][j][k]+=f[i-][j][k];
if (j>=) f[i][j][k]+=f[i-][j-][k]*(m-j-k+);
if (k>= && j<=m-)f[i][j][k]+=f[i-][j+][k-]*(j+);
if (j>=) f[i][j][k]+=f[i-][j-][k]*C(m-j-k+);
if (k>= && j<=m-)f[i][j][k]+=f[i-][j+][k-]*C(j+);
if (j>= && k>=) f[i][j][k]+=f[i-][j][k-]*j*(m-j-k+);
f[i][j][k]%=P;
}
}
}
ll ans=;
for (int i=;i<=m;i++){
for (int j=;j<=m-i;j++){
ans+=f[n][i][j];
ans%=P;
}
}
printf("%lld\n",ans);
return ;
}

4807

就是 max(m,n) C min (m,n)

 /* http://www.cnblogs.com/karl07/ */
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
struct INT {
int b,a[];
INT (){b=; for (int i=;i<=;i++) a[i]=;}
};
int A,B,c,n,m;
int P[],p[],cnt[],ip[];
INT Int(int x){
INT a;
for (a.b= ; x ; a.a[++a.b]=x%,x/=);
return a;
} INT operator * (const INT &x,const INT &y){
INT a;
a.b=min(,x.b+y.b-);
for (int i=;i<=x.b;i++) for (int j=;j<=y.b;j++) if (i+j-<=) a.a[i+j-]+=x.a[i]*y.a[j];
for (int i=;i<=a.b;a.b+=(i==a.b && a.a[i+] && i+<=),i++) a.a[i+]+=a.a[i]/,a.a[i]%=;
for (;a.a[a.b]== && a.b!=; a.b--);
return a;
} void print_INT(INT x){
for (int i=min(x.b,);i>=;i--) printf("%d",x.a[i]);
puts("");
} void Prime(int n){
for (int i=;i<=n;i++){
if (!P[i]){
p[++c]=i,ip[i]=c;
for (int j=i+i;j<=n;j+=i) P[j]=;
}
}
} void pt(int x) {
printf("%d\n",x);
} void fac(int x,int y){
for (int i=;i<=c && P[x];i++) while (!(x%p[i])) x/=p[i],cnt[i]+=y;
cnt[ip[x]]+=y;
} INT ans=Int();
int main(){
scanf("%d%d",&A,&B);
n=max(A,B),m=max(max(A,B)-min(A,B),min(A,B));
Prime(n);
for (int i=m+;i<=n;i++) fac(i,);
for (int i=;i<=n-m;i++) fac(i,-);
for (int i=;i<=c;i++) while (cnt[i]--) ans=ans*Int(p[i]);
print_INT(ans);
return ;
}

4808

黑白染色然后匈牙利

 /* http://www.cnblogs.com/karl07/ */
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; struct edge{
int next,to;
}e[];
int ade,n,m,cnt,T,c;
int x[]={,,-,-,-,,,-};
int y[]={,,-,-,,-,-,};
int mp[][],id[][],first[],vis[],match[]; void addedge(int x,int y){
e[++ade].next=first[x];
e[ade].to=y;
first[x]=ade;
} bool check(int x,int y){
return (x>= && x<=n && y>= && y<=m && !mp[x][y]);
} #define s e[x].to
bool hungary(int p){
for (int x=first[p];x;x=e[x].next){
if (vis[s]!=T){
vis[s]=T;
if (!match[s] || hungary(match[s])) {match[s]=p; return ;}
}
}
return ;
}
#undef s int main(){
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++){
for (int j=;j<=m;j++){
scanf("%d",&mp[i][j]);
cnt+=(!mp[i][j]);
id[i][j]=++c;
}
}
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
if (((i+j)&) && !mp[i][j])for (int k=;k<;k++) if (check(i+x[k],j+y[k])) addedge(id[i][j],id[i+x[k]][j+y[k]]);
for (int i=;i<=n;i++){
for (int j=;j<=m;j++){
if (!mp[i][j] && ((i+j)&)){
T=id[i][j];
cnt-=hungary(T);
}
}
}
printf("%d\n",cnt);
return ;
}

4809

直接dfs

 /* http://www.cnblogs.com/karl07/ */
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; int n,ans;
int ban[][],y[],a[],b[]; void dfs(int i){
if (i>n) {ans++; return;}
for(int j=;j<=n;j++) if (!(ban[i][j] || y[j] || a[i+j-] || b[n-i+j] )){
y[j]=a[i+j-]=b[n-i+j]=;
dfs(i+);
y[j]=a[i+j-]=b[n-i+j]=;
}
} int main(){
scanf("%d",&n);
for (int i=;i<=n;i++) for (int j=;j<=n;j++) scanf("%d",&ban[i][j]);
dfs();
printf("%d\n",ans);
return ;
}

皇后

【bzoj4806~bzoj4809】 象棋四连发 DP-高精度-匈牙利算法-dfs的更多相关文章

  1. 匈牙利算法dfs模板 [二分图][二分图最大匹配]

    最近学了二分图最大匹配,bfs模板却死活打不出来?我可能学了假的bfs 于是用到了dfs模板 寻找二分图最大匹配的算法是匈牙利算法 匈牙利算法的主要程序是寻找增广路 寻找增光路是过程是:从一个未经配对 ...

  2. 匈牙利算法 DFS模板(了解度+1)

    //算法核心是求最大匹配数 #include<bits/stdc++.h> #include<iostream> #include<cstdio> #include ...

  3. 二分图最大匹配(匈牙利算法Dfs模板)

    #include<iostream> #include<cstdio> #include<cstring> #define maxn 2020 using name ...

  4. POJ-1469 COURSES ( 匈牙利算法 dfs + bfs )

    题目链接: http://poj.org/problem?id=1469 Description Consider a group of N students and P courses. Each ...

  5. ACM/ICPC 之 机器调度-匈牙利算法解最小点覆盖集(DFS)(POJ1325)

    //匈牙利算法-DFS //求最小点覆盖集 == 求最大匹配 //Time:0Ms Memory:208K #include<iostream> #include<cstring&g ...

  6. HDU5090--Game with Pearls 二分图匹配 (匈牙利算法)

    题意:给N个容器,每个容器里有一定数目的珍珠,现在Jerry开始在管子上面再放一些珍珠,放上的珍珠数必须是K的倍数,可以不放.最后将容器排序,如果可以做到第i个容器上面有i个珍珠,则Jerry胜出,反 ...

  7. "《算法导论》之‘图’":不带权二分图最大匹配(匈牙利算法)

    博文“二分图的最大匹配.完美匹配和匈牙利算法”对二分图相关的几个概念讲的特别形象,特别容易理解.本文介绍部分主要摘自此博文. 还有其他可参考博文: 趣写算法系列之--匈牙利算法 用于二分图匹配的匈牙利 ...

  8. cogs 728. [网络流24题] 最小路径覆盖问题 匈牙利算法

    728. [网络流24题] 最小路径覆盖问题 ★★★☆   输入文件:path3.in   输出文件:path3.out   评测插件时间限制:1 s   内存限制:128 MB 算法实现题8-3 最 ...

  9. 1166 矩阵取数游戏[区间dp+高精度]

    1166 矩阵取数游戏 2007年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description [ ...

随机推荐

  1. c#中{set;get;}使用逻辑

    (先把结论提前)下面两种定义私有变量配合公有变量的方法都没有意义,除非有特殊的逻辑需要在set或get中,其它情况都等效于 public GM_Arc Arc {set;get;} //不进行初始化, ...

  2. JPA 注解详解

    @Entity --声明为一个实体类bean @Table (name= "promotion_info" ) --为实体bean映射指定表(表名="promotion_ ...

  3. oracle更改编码

    背景:win764bit英文操作系统(支持中文) oracle11G默认安装 从ZHS16GBK字符集导入数据库 表现:plsql显示为乱码,所有汉字显示为“靠” 解决:1.查看并更改数据库的编码为Z ...

  4. SQL提取数据库表名,字段名等信息

    -------提取数据库所有表的表名.字段名 -------在SQLserver 2000中测试 --查询所有用户表所有字段的特征 SELECT D.Name as TableName, A.colo ...

  5. C++虚函数与纯虚函数用法与区别(转载)

    1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class) ...

  6. 0k6410定时器详细分析

    看到一篇很好的博文,分析2410定时器中断的使用的,很详细,和大家分享一下 转载来源于http://www.cnblogs.com/Neddy/archive/2011/07/01/2095176.h ...

  7. 并发之Striped64(l累加器)

    并发之Striped64(累加器)     对于该类的实现思想:    Striped64是在java8中添加用来支持累加器的并发组件,它可以在并发环境下使用来做某种计数,Striped64的设计思路 ...

  8. Java-Http

    1 import java.io.BufferedReader; 2 import java.io.BufferedWriter; 3 import java.io.IOException; 4 im ...

  9. ubuntu16.04 Mask_RCNN AlphaPose OpenPose Librealsense

    #############MaskRCNNcource activate flappbirdcd /home/luo/Desktop/MyFile/MaskRCNN/MyOwnMaskRCNN1/sa ...

  10. Luogu 3265 [JLOI2015]装备购买

    BZOJ 4004 把所有不能相互表示出来的向量都买下,一定能得到最大能买的方案数. 求解线性无关向量可以高斯消元,最后没有变成$0$向量的就是基底. 本题还要求代价最小怎么办?我们只要先把所有向量按 ...