【bzoj4806~bzoj4809】 象棋四连发 DP-高精度-匈牙利算法-dfs
都是经典题了吧。。我好无聊。。
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 ;
}
炮
就是 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 ;
}
车
黑白染色然后匈牙利
/* 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 ;
}
马
直接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的更多相关文章
- 匈牙利算法dfs模板 [二分图][二分图最大匹配]
最近学了二分图最大匹配,bfs模板却死活打不出来?我可能学了假的bfs 于是用到了dfs模板 寻找二分图最大匹配的算法是匈牙利算法 匈牙利算法的主要程序是寻找增广路 寻找增光路是过程是:从一个未经配对 ...
- 匈牙利算法 DFS模板(了解度+1)
//算法核心是求最大匹配数 #include<bits/stdc++.h> #include<iostream> #include<cstdio> #include ...
- 二分图最大匹配(匈牙利算法Dfs模板)
#include<iostream> #include<cstdio> #include<cstring> #define maxn 2020 using name ...
- POJ-1469 COURSES ( 匈牙利算法 dfs + bfs )
题目链接: http://poj.org/problem?id=1469 Description Consider a group of N students and P courses. Each ...
- ACM/ICPC 之 机器调度-匈牙利算法解最小点覆盖集(DFS)(POJ1325)
//匈牙利算法-DFS //求最小点覆盖集 == 求最大匹配 //Time:0Ms Memory:208K #include<iostream> #include<cstring&g ...
- HDU5090--Game with Pearls 二分图匹配 (匈牙利算法)
题意:给N个容器,每个容器里有一定数目的珍珠,现在Jerry开始在管子上面再放一些珍珠,放上的珍珠数必须是K的倍数,可以不放.最后将容器排序,如果可以做到第i个容器上面有i个珍珠,则Jerry胜出,反 ...
- "《算法导论》之‘图’":不带权二分图最大匹配(匈牙利算法)
博文“二分图的最大匹配.完美匹配和匈牙利算法”对二分图相关的几个概念讲的特别形象,特别容易理解.本文介绍部分主要摘自此博文. 还有其他可参考博文: 趣写算法系列之--匈牙利算法 用于二分图匹配的匈牙利 ...
- cogs 728. [网络流24题] 最小路径覆盖问题 匈牙利算法
728. [网络流24题] 最小路径覆盖问题 ★★★☆ 输入文件:path3.in 输出文件:path3.out 评测插件时间限制:1 s 内存限制:128 MB 算法实现题8-3 最 ...
- 1166 矩阵取数游戏[区间dp+高精度]
1166 矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description [ ...
随机推荐
- 40个Java多线程问题总结【转】
1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓”知其然知其所以然”,”会用”只是”知其然”,”为什么用”才是”知其所以然 ...
- 关于 object-c的@protocol的理解
从java角度来理解 @protocol 相当于 java 的接口定义,用法也一样 下面是试验例子 @protocol mytestClass <NSObject> - (void) ca ...
- 基本的Ceph性能测试工具和方法
测试环境 1. 测试准备 1.1 磁盘读写性能 1.1.1 单个 OSD 磁盘写性能,大概 165MB/s. root@ceph1:~# echo 3 > /proc/sys/vm/drop_c ...
- babel-polyfill使用简介
babel-polyfill介绍 简介 使用这个插件你可随心所欲的使用es6甚至更高版本的方法,这个插件自动转码 安装 这个插件必须在你的源码运行之前运行,所以必须安装成dependency npm ...
- wpa_supplicant移植与使用(转)
下载wpa_supplicant最新版和openssl(编译wpa_supplicant需要openssl的库) 我这里使用的是wpa_supplicant-0.7.3.tar.gz和openssl- ...
- S3C6410移植u-boot
1.首先下载u-boot(ftp://ftp.denx.de/pub/u-boot) wget ftp://ftp.denx.de/pub/u-boot/u-boot-latest.tar.bz2 2 ...
- nginx搭建文件服务器配置文件
worker_processes 1; events { worker_connections 1024;} http { include mime.types; default_type appli ...
- spring框架 使用 JdbcTemplate 对数据进行增删改查
user=LF password=LF jdbcUrl=jdbc:oracle:thin:@localhost:1521:orcl driverClass=oracle.jdbc.driver.Ora ...
- 虚拟机ubuntu18.04设置静态IP
说明: 网关:192.168.8.2 待设置静态IP:192.168.8.25 1.编辑:vi /etc/netplan/01-network-manager-all.yaml 打开以后内容如下: # ...
- C/C++代码覆盖率工具gcov、lcov
gcov是一个可用于C/C++的代码覆盖工具,是gcc的内建工具.下面介绍一下如何利用gcov来收集代码覆盖信息. 想要用gcov收集代码覆盖信息,需要在gcc编译代码的时候加上这2个选项 “-fpr ...