当前位置: 首页 > news >正文

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=1050,max2=70,maxm=110,maxn=10;
int transx[max4][max2],transy[max4][max2],dp[2][maxm][max4],last[2][maxm][max4];
int ans[maxm],f[maxn],tem[maxn],dis[maxn],quex[2][300000],quey[2][300000],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[2];
    scanf("%d%d%d",&n,&m,&p);
    //预处理转移数组; 
    for(int s=0;s<(1<<(2*(n-1)));++s){//上一行的最短路情况; 
        ok=1;
        for(int i=1;i<n;++i){
            x=(s>>((i-1)*2))&3;
            if(x==2){ok=0;break;}
            if(x){
                if(x==1)f[i]=f[i-1]+1;
                else f[i]=f[i-1]-1;
            }
            else f[i]=f[i-1];
        }
        if(!ok)continue;
        for(int t=0;t<(1<<n);++t){//这一行的棋盘情况; 
            for(int i=0;i<n;++i)tem[i]=(t>>i)&1;
            dis[0]=f[0]+tem[0];
            for(int i=1;i<n;++i)dis[i]=min(dis[i-1],f[i])+tem[i];
            for(int i=n-2;i>=0;--i)dis[i]=min(dis[i],dis[i+1]+tem[i]);
            transy[s][t]=dis[0];
            for(int i=1;i<n;++i){
                if(dis[i]==dis[i-1])x=0;
                else if(dis[i]==dis[i-1]+1)x=1;
                else x=3;
                transx[s][t]|=x<<(2*(i-1)); 
            }
        }
    }
    //处理初始态;
    for(int t=0;t<(1<<n);++t){
        x=0;
        for(int i=1;i<n;++i)if((t>>i)&1)x|=1<<(2*(i-1));
        y=t&1;
        if(last[1][y][x])update(dp[1][y][x],1);
        else{
            last[1][y][x]=1;
            dp[1][y][x]=1;
            tl[1]++;
            quex[1][tl[1]]=x;
            quey[1][tl[1]]=y;
        } 
    }
    //转移
    for(int i=2,c=0;i<=m;++i,c^=1){
        tl[c]=0;
        for(int j=1;j<=tl[c^1];++j){
            x=quex[c^1][j];
            y=quey[c^1][j];
            for(int t=0;t<(1<<n);++t){
                x1=transx[x][t];
                y1=y+transy[x][t];
                if(last[c][y1][x1]==i)update(dp[c][y1][x1],dp[c^1][y][x]);
                else{
                    last[c][y1][x1]=i;
                    dp[c][y1][x1]=dp[c^1][y][x];
                    tl[c]++;
                    quex[c][tl[c]]=x1;
                    quey[c][tl[c]]=y1;
                }
            }
        } 
    }
    //统计答案
    for(int j=1;j<=tl[m&1];++j){
        x=quex[m&1][j];
        y1=y=quey[m&1][j];
        for(int i=1;i<n;++i){
            x1=(x>>(2*(i-1)))&3;
            if(x1==1)y1++;
            else if(x1==3)y1--;
        }
        update(ans[y1],dp[m&1][y][x]);
    } 
    for(int i=0;i<n+m;++i)printf("%d\n",ans[i]);
    return 0;
} 

 

转载于:https://www.cnblogs.com/dibaotianxing/p/8505866.html

相关文章:

  • KPN iTV的敏捷转型之旅
  • 设计模式之禅之单例模式!
  • 纠纷判决已出,法官要求Uber归还所有Waymo自动驾驶机密文件
  • 10个最新交互式Web设计实例欣赏
  • VSCode建立.net core项目
  • 事物(物质)的存在形式:结构与运动、维度空间:结构-空间,运动-时间...
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 商城系统针对开发者自有支付系统提供的解决方案
  • 基于Redis实现分布式消息队列(4)
  • Java 多线程之线程池的使用
  • 5、React组件事件详解
  • Linksys WRT54G 路由器溢出漏洞分析—— 运行环境修复
  • 也谈链路劫持
  • kbasesrv篡改主页分析
  • 陈皓:如何测试洗牌程序
  • 2017年终总结、随想
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • ECS应用管理最佳实践
  • ES6--对象的扩展
  • HomeBrew常规使用教程
  • JavaScript函数式编程(一)
  • Koa2 之文件上传下载
  • Mysql数据库的条件查询语句
  • Spring Cloud Feign的两种使用姿势
  • WebSocket使用
  • 安卓应用性能调试和优化经验分享
  • 和 || 运算
  • 基于 Babel 的 npm 包最小化设置
  • 计算机在识别图像时“看到”了什么?
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 正则学习笔记
  • 数据可视化之下发图实践
  • #mysql 8.0 踩坑日记
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (12)目标检测_SSD基于pytorch搭建代码
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (175)FPGA门控时钟技术
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (九)信息融合方式简介
  • (排序详解之 堆排序)
  • (算法)N皇后问题
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)ORM
  • .Net Remoting常用部署结构
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .NET中GET与SET的用法
  • [ C++ ] 继承
  • [100天算法】-不同路径 III(day 73)
  • [ActionScript][AS3]小小笔记