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 ...
随机推荐
- k8s学习笔记之一:kubernetes简介
一.虚拟化技术 1.什么是虚拟化技术 虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立 ...
- python常见循环练习
第一题:求5的阶乘 # 方法1,递归 def jc(num): if num == 1: return 1 else: return num*jc(num-1) print(jc(5)) # 方法2, ...
- 新部署tomcat,An error occurred at line: [1] index_jsp.java
环境: centos6.5 32位 oracle jdk 1.8 tomcat 7 问题: yum install tomcat后,返回如下错误: [root@centos]~# curl -v ht ...
- Linux环境变量设置/etc/profile、/etc/bashrc、~/.profile、~/.bashrc区别
登入系统读取步骤: 当登入系统时候获得一个shell进程时,其读取环境设定档有三步 : 1.首先读入的是全局环境变量设定档/etc/profile,然后根据其内容读取额外的设定的文档,如 /etc/p ...
- leetcode647
class Solution { public: ][],int i,int j){ if(i>=j){ return true; } else{ return DP[i][j]; } } in ...
- ---perl 模块安装方法
http://blog.csdn.net/lincy100/article/details/7333794 $ perl -MCPAN -e shell install Log::Log4perlin ...
- django + nginx + uwsgi
server{ listen ; server_name 0.0.0.0; charset utf-; access_log /var/log/nginx/access.log main; locat ...
- Failed to resolve:com.android.support:appcompat-v7:报错处理
既然是版本问题,那就的先去了解自己的电脑安装的SDK工具版本,点开SDK Manager图标,然后选中Updates就可以看到了 这里我的 sdk 工具版本就是26.1.1了 报错是因为自己的andr ...
- Centos7安装部署Zabbix3.4
1.关闭selinux和firewall 1.1检测selinux是否关闭 [root@localhost ~]# getenforce Disabled ...
- 在Laravel中使用mongoDB
https://blog.csdn.net/weixin_38682852/article/details/80840678?utm_source=blogxgwz1 https://blog.csd ...