51nod1683
代码参考:http://blog.csdn.net/sdfzyhx/article/details/74359927
//dp[i][j][k]表示到了第i列,最下边的点最短路为j,剩下的点之间的关系为k的方案;
//只需知道这一行的棋盘状态和上一行的最短路之间的相对关系(1,0,-1)即可完成转移;
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int max4=,max2=,maxm=,maxn=;
int transx[max4][max2],transy[max4][max2],dp[][maxm][max4],last[][maxm][max4];
int ans[maxm],f[maxn],tem[maxn],dis[maxn],quex[][],quey[][],n,m,p;
void update(int &x,int y){
x+=y;
x=(x>=p?x-p:x);
}
int main(){
int x,y,x1,y1,ok,tl[];
scanf("%d%d%d",&n,&m,&p);
//预处理转移数组;
for(int s=;s<(<<(*(n-)));++s){//上一行的最短路情况;
ok=;
for(int i=;i<n;++i){
x=(s>>((i-)*))&;
if(x==){ok=;break;}
if(x){
if(x==)f[i]=f[i-]+;
else f[i]=f[i-]-;
}
else f[i]=f[i-];
}
if(!ok)continue;
for(int t=;t<(<<n);++t){//这一行的棋盘情况;
for(int i=;i<n;++i)tem[i]=(t>>i)&;
dis[]=f[]+tem[];
for(int i=;i<n;++i)dis[i]=min(dis[i-],f[i])+tem[i];
for(int i=n-;i>=;--i)dis[i]=min(dis[i],dis[i+]+tem[i]);
transy[s][t]=dis[];
for(int i=;i<n;++i){
if(dis[i]==dis[i-])x=;
else if(dis[i]==dis[i-]+)x=;
else x=;
transx[s][t]|=x<<(*(i-));
}
}
}
//处理初始态;
for(int t=;t<(<<n);++t){
x=;
for(int i=;i<n;++i)if((t>>i)&)x|=<<(*(i-));
y=t&;
if(last[][y][x])update(dp[][y][x],);
else{
last[][y][x]=;
dp[][y][x]=;
tl[]++;
quex[][tl[]]=x;
quey[][tl[]]=y;
}
}
//转移
for(int i=,c=;i<=m;++i,c^=){
tl[c]=;
for(int j=;j<=tl[c^];++j){
x=quex[c^][j];
y=quey[c^][j];
for(int t=;t<(<<n);++t){
x1=transx[x][t];
y1=y+transy[x][t];
if(last[c][y1][x1]==i)update(dp[c][y1][x1],dp[c^][y][x]);
else{
last[c][y1][x1]=i;
dp[c][y1][x1]=dp[c^][y][x];
tl[c]++;
quex[c][tl[c]]=x1;
quey[c][tl[c]]=y1;
}
}
}
}
//统计答案
for(int j=;j<=tl[m&];++j){
x=quex[m&][j];
y1=y=quey[m&][j];
for(int i=;i<n;++i){
x1=(x>>(*(i-)))&;
if(x1==)y1++;
else if(x1==)y1--;
}
update(ans[y1],dp[m&][y][x]);
}
for(int i=;i<n+m;++i)printf("%d\n",ans[i]);
return ;
}
51nod1683的更多相关文章
- DP没入门就入土
写在前面 记录最近刷的DP题 以及 打死都不可能想到状态设计DP系列 汇总 洛谷 P6082 [JSOI2015]salesman 树形\(\texttt{DP}\) + 优先队列 比较容易看出来这是 ...
- 51Nod 1683 最短路
题意 给定一个未知的\(0/1\)矩阵,对每个\(i\)求\((1,1)\sim(n,m)\)最短路为\(i\)的概率,在矩阵中不能向左走,路径长度为路径上权值为\(1\)的格子个数. \(n\leq ...
随机推荐
- 游戏中转盘概率的算法---python实现
加入转盘的内容及概率如下 转盘倍数 0.5 0.6 0.7 0.8 1 1.2 1.5 1.8 2 机率 0.2 0.15 0.15 0.2 0.2 0.1 0.1 0.05 0.05 下面来实现转盘 ...
- centos svn强制要求提交代码时写注释
1. 重命名svn主目录中hooks的pre-commit.tmpl文件为pre-commit,并添加可执行权限 mv pre-commit.tmpl pre-commit chmod u+x pre ...
- python函数作用域,嵌套函数,闭包
函数作用域 ...
- Error creating bean with name 'transactionManager'
查看数据库是否连通,看错误的具体信息 看ssm配置文件是否被正确加载,上次我的错误是beans之类的错误,就是spring文件没有被加载,因为 而文件是applicationConfig.xml
- PhoenixFD插件流体模拟——UI布局【Resimulation】详解
Liquid Resimulation 流体再(重)渲染 本文主要讲解Resimulation折叠栏中的内容 主要内容 Overview 综述 Parameters 参数 综述 Liquid Resi ...
- as3.0 当fla里面有TLF文本的时候,加载声音会出现错误
问题描述 1.现有制作好的mp3加载包,这个包是相对路径 2.如果fla里面没有TLF文本,可以正常运行 解题思路 1.音频的相对路径和加载TLF文本的路径不一样,fla会优先选择TLF文件,这样mp ...
- 无监督学习算法-Apriori进行关联分析
关联分析 是无监督讯息算法中的一种,Apriori主要用来做_关联分析_,_关联分析_可以有两种形式:频繁项集或者关联规则.举个例子:交易订单 序号 商品名称 1 书籍,电脑 2 杯子,手机,手机壳, ...
- 手动添加jar包到本地maven仓库
我们都知道使用maven管理jar包的时候,我们需要到远程仓库下载相关的jar包到本地仓库,但是如果远程仓库没有这个jar包呢?这时候我们就需要手动将jar包添加到本地仓库. 起因是我想用百度的富文本 ...
- node.js中process进程的概念和child_process子进程模块的使用
进程,你可以把它理解成一个正在运行的程序.node.js中每个应用程序都是进程类的实例对象. node.js中有一个 process 全局对象,通过它我们可以获取,运行该程序的用户,环境变量等信息. ...
- protobuff 编译注意事项
把protoc.exe增加到环境变量path,这样方便运行protoc 生成C++代码 protoc -I=Proto文件路径 –cpp_out=指定输出.h和.cc的目录 Proto文件 具体参数 ...