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

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. Py修行路 python基础 (五)三元运算 字符编码 元组 集合 三级菜单优化!

    三元运算 条件判断不能加冒号: a=3 b=5 c=a if a<b else b oct() 转成八进制的简写:16进制 标志:BH为后缀或是0x为前缀hex() 转成16进制 元组 跟列表是 ...

  2. Kali下Ahmyth的使用

    项目地址:https://github.com/AhMyth/AhMyth-Android-RAT 下载后打开 安装nodejs,nodejs在官网下载,下载完后解压,切到bin目录下 设置全局 ro ...

  3. Linq入门博客系列地址http://www.cnblogs.com/lifepoem/category/330218.html

    http://www.cnblogs.com/lifepoem/category/330218.html Linq及LambdaSql语句: http://kb.cnblogs.com/page/42 ...

  4. pandas索引操作

    Pandas的索引操作 索引对象Index 1. Series和DataFrame中的索引都是Index对象 示例代码: print(type(ser_obj.index)) print(type(d ...

  5. 并发模型(一)——Future模式

    多线程开发可以更好的发挥多核cpu性能,常用的多线程设计模式有:Future.Master-Worker.Guard Susperionsion.不变.生产者-消费者 模式: jdk除了定义了若干并发 ...

  6. IAR&nbsp;FOR&nbsp;ARM&nbsp;各版…

    用过Keil和IAR,个人感觉是IAR还是很不错的.下载地址是: http://files.iar.com/ftp/pub/box/CD-EWARM-6301-3142.zip V6.30.1(该地址 ...

  7. spring中二个重要点

    spring核心主要两部分: (1)aop: 面向切面编程,扩展功能不是修改源代码实现 (2)ioc: 控制反转

  8. 字符编码(续)---Unicode与ANSI字符串转换以及分辨字符编码形式

    Unicode与ANSI字符串转换 我们使用windows函数MultiByteToWideChar将多字节字符串转换为宽字符字符串,如下: int MultiByteToWideChar( UINT ...

  9. codeforce452DIV2——E. Segments Removal

    题目 Vasya has an array of integers of length n. Vasya performs the following operations on the array: ...

  10. 【bzoj3942】[Usaco2015 Feb]Censoring

    [题目大意] 有一个S串和一个T串,长度均小于1,000,000,设当前串为U串,然后从前往后枚举S串一个字符一个字符往U串里添加,若U串后缀为T,则去掉这个后缀继续流程. [样例输入] whatth ...