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-web自动化-元素操作:windows窗口切换 / alert切换 / iframe切换
1. windows窗口切换:切换到要操作的窗口 有多个窗口: 1. 触发新窗口的出现 2. 得知道新窗口是谁 -- 依据窗口的window_handle来识别窗口 3. 得到窗口的window_ha ...
- Oracle导出表数据与导入表数据dmp,以及导入导出时候常见错误
使用DOS 操作界面导出表数据,导入表数据(需要在数据库所在的服务器上边执行) exp UserName/Password@192.168.0.141/orcl file=d:\xtables.d ...
- linux tail 命令详解
linux ---tail命令 linux中tail命令---用于查看文件内容 最基本的是cat.more和less. 1. 如果你只想看文件的前5行,可以使用head命令,如: head -5 /e ...
- 一针见血tomcat
一针见血tomcat 一.Tomcat各组件认知 1 Tomcat架构说明 Tomcat是一个基于JAVA的WEB容器,其实现了JAVA EE中的 Servlet 与 jsp 规范,与Nginx ap ...
- Django多个中间件的执行顺序
Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健 ...
- 格式化hdfs后,hadoop集群启动hdfs,namenode启动成功,datanode未启动
集群格式化hdfs后,在主节点运行启动hdfs后,发现namenode启动了,而datanode没有启动,在其他节点上jps后没有datanode进程!原因: 当我们使用hdfs namenode - ...
- Android Room 学习(一)
Room简介 Room persistence库为SQLite提供了一个抽象层,以便在利用SQLite的全部功能的同时实现更强大的数据库访问. 该库可帮助您在运行应用程序的设备上创建应用程序数据的缓存 ...
- Asp.Net+JQuery.Ajax之$.post
段时间有点跑偏,经过米老师和师傅的耐心指导,终于认识到自己的问题,现在回归常规路线,继续B/S的学习. 经过近半个月的熏陶,对JQuery慢慢的有了亲切感.当时我采访过一清,问他看完JQuery视频有 ...
- Beta冲刺——第一天
beta冲刺:第一天 各个成员今日完成的任务 成员 冯晓.马思远 彭辉.王爽 吴琼.郝延婷 今日完成任务 ·参会人员注册代码规范与功能测试 ·网站的前端代码调整 ·代码规范 ·系统功能测试 ·博客撰写 ...
- mui页面传值
以下代码全部在script标签内 一.通过mui.openWindow()打开新页面(若目标页面为已预加载成功的页面,则在openWindow方法中传递的extras参数无效): mui.openWi ...