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 ...
随机推荐
- 性能测试day05_Jmeter学习
今天来学习下jmeter这个性能测试工具,虽然说性能测试最主要的是整个性能的思路,但是也少不了工具的帮忙,从以前主流的LR到jmeter的兴起,不过对于性能测试来说,个人感觉jmeter比较适合接口性 ...
- struts2 default.xml详解
struts2 default.xml 内容 1 bean节点制定Struts在运行的时候创建的对象类型. 2 指定Struts-default 包 用户写的package(struts.xml) ...
- 异步请求Ajax(取得json数据)
异步请求Ajax 没有学习Ajax之前请求数据的时候都是整个页面全部刷新了一次,也就是每次请求都会重新请求所有的资源.但是在很多时候不需要页面全部刷新,仅仅是需要页面的局部数据刷新即可,此时需要发送异 ...
- 深度学习原理与框架-递归神经网络-RNN网络基本框架(代码?) 1.rnn.LSTMCell(生成单层LSTM) 2.rnn.DropoutWrapper(对rnn进行dropout操作) 3.tf.contrib.rnn.MultiRNNCell(堆叠多层LSTM) 4.mlstm_cell.zero_state(state初始化) 5.mlstm_cell(进行LSTM求解)
问题:LSTM的输出值output和state是否是一样的 1. rnn.LSTMCell(num_hidden, reuse=tf.get_variable_scope().reuse) # 构建 ...
- 一个类似于jq的小型库
本人写了一个类似于jq的小型库,不过只是写了部分方法而已.并没有jq那么全面,下面就介绍下有哪些方法可以使用 第一个是选择器, 选择器比较简单 只支持ID选择器 $(‘#id_name’) Class ...
- 关于EXCEPT和INTERSECT的用法和例子
EXCEPT是指在第一个集合中存在,但是不存在于第二个集合中的数据. INTERSECT是指在两个集合中都存在的数据. select qq from #table1 如下: select qq fro ...
- Django中的class Meta
元数据 class Meta做为嵌套类,主要目的是给上级类添加一些功能,或者指定一些标准 # 格式化 将返回的结果自定义 def __str__(self) rerurn self.username ...
- 微信小程序开发之保留小数(toFixed) 四舍五入 获取整数 string转int
https://blog.csdn.net/qq_31383345/article/details/52961767
- EF连接Mysql 表'TableDetails'中的列'IsPrimaryKey'的值为DBNull
无法生成模型,因为存在以下异常:'System.Data.StrongTypingException:表'TableDetails'中的列'IsPrimaryKey'的值为DBNull.---> ...
- 解决xcode10打包报错:That command depends on command in Target ‘xxx’:scrpit phase"[CP] Copy Pods Resources"
问题:使用xcode10打包报错,提示 error:Multiple commands produce ‘xxxx/xxx.app’ 1)Target ‘xx’ has create director ...