代码参考: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的更多相关文章

  1. DP没入门就入土

    写在前面 记录最近刷的DP题 以及 打死都不可能想到状态设计DP系列 汇总 洛谷 P6082 [JSOI2015]salesman 树形\(\texttt{DP}\) + 优先队列 比较容易看出来这是 ...

  2. 51Nod 1683 最短路

    题意 给定一个未知的\(0/1\)矩阵,对每个\(i\)求\((1,1)\sim(n,m)\)最短路为\(i\)的概率,在矩阵中不能向左走,路径长度为路径上权值为\(1\)的格子个数. \(n\leq ...

随机推荐

  1. 学习excel的使用技巧二批量复制

    1 选中要操作的部分 2 CTRL+G 打开定位 3 点击 定位条件 4 选择空值 5 输入=号  然后键盘的 方向键  向上 6 按住CTRL+回车 即可实现  批量复制

  2. Web请求过程

    一.Http解析 Http Header控制着成千上万的互联网用户的数据传输,控制着用户浏览器的渲染行为和服务器的执行逻辑. HTTP请求头 Accept-Language: zh-cn,zh;q=0 ...

  3. Ado.net之连接数据库

    一.Ado.net的核心 Ado.net的核心为两组重要的类,一个负责处理软件内部的实际数据(DataSet),另一个负责与外部数据系统通信(DataProvider) DataSet:包含一个或多个 ...

  4. jquery之find,filter,has对比

    find()方法找的是符合条件的后代,返回的是子元素. $('div').find('.intro').css('color','red'); //寻找div后代类为intro的元素 filter() ...

  5. Beta冲刺——第一天

    beta冲刺:第一天 各个成员今日完成的任务 成员 冯晓.马思远 彭辉.王爽 吴琼.郝延婷 今日完成任务 ·参会人员注册代码规范与功能测试 ·网站的前端代码调整 ·代码规范 ·系统功能测试 ·博客撰写 ...

  6. Django 重写用户模型

    AUTH_USER_MODEL = 'myapp.MyUser' django——重写用户模型 Django内建的User模型可能不适合某些类型的项目.例如,在某些网站上使用邮件地址而不是用户名作为身 ...

  7. Echarts 柱状图属性详解

    <script type="text/javascript"> // 基于准备好的dom,初始化echarts实例 var myChart = echarts.init ...

  8. git 提交丢失Warning, you are leaving 2 commits behind,

    早上在自己的一个版本代码上编辑,提交commint,但是checkout到其他分支再checkout回来发现该的东西不见了, 幸好terminal还没有关掉,回看日志: Warning: you ar ...

  9. mybatis-generator 覆盖新增XML

    参考文章:https://www.cnblogs.com/xxoome/p/10068780.html 1.添加依赖(版本1.3.7) plugin> <groupId>org.my ...

  10. hdu 4714 树+DFS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4714 本来想直接求树的直径,再得出答案,后来发现是错的. 思路:任选一个点进行DFS,对于一棵以点u为 ...