[BZOJ3185][Coci2011][DP]kamion

2023-05-16

考虑转化一下问题
f(i,j,k) 表示从i到j恰好用了k步,并且到j的时候火车厢为空的方案数。

那么转移就是 f(i,j,k)=f(a,b,k1)f(c,j,k2) ,转移成立当且仅当存在i->a的边,载上货物x;b->c的边卸下货物x,k1+k2+2=k

但是这个DP时间复杂度是 O(E2k2) ,这个时候要引入一个新的函数 g(i,j,k) ,表示从i到j恰好用了k步,到j时车厢为空,且中途车厢从来没空过

那么转移就变成 f(i,j,k)=g(i,a,k1)f(a,j,kk1)+f(b,j,k1)
g(i,j,k)=f(a,b,k2) ,其中存在i->a的边在上货物x,b->j的边卸下货物x,存在i->b的路径不需要载上或卸下货物。

这样每次转移就优化到 O(n4)

那至于怎么求出原题的答案,原题解很抠,没有给出…

需要再引入一个函数 h(i,j,k) ,表示从i到j用了k步,但是车厢不一定为空的方案数…
转移还是 h(i,j,k)=g(i,a,k1)h(a,j,kk1)+h(b,j,k1)
因为神奇的g函数,这样转移的正确也就保证了……

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#define N 55
#define P 10007
#define foc(x,a) for(ITR x=a.begin();x!=a.end();x++)

using namespace std;

typedef pair<int,int> parii;
typedef vector<parii>::iterator ITR;

int n,m,K,Ans;
char A[100];
int f[N][N][N][2],g[N][N][N];
vector<parii> load[N][30],unload[N][30];
vector<parii> road[N],iroad[N];

inline void Read(){
  gets(A);
  int x,y,cnt; char c;
  cnt=sscanf(A,"%d %d %c",&x,&y,&c);
  if(cnt==2){
    road[x].push_back(parii(x,y));
    iroad[x].push_back(parii(x,y));
  }
  else if(c>='A'&&c<='Z'){
    load[x][c-'A'].push_back(parii(x,y));
    iroad[x].push_back(parii(x,y));
  }
  else unload[y][c-'a'].push_back(parii(x,y));

}

int main(){
  scanf("%d%d%d",&n,&m,&K); gets(A);
  for(int i=1;i<=m;i++) Read();
  for(int i=1;i<=n;i++) f[i][i][0][0]=f[i][i][0][1]=1;
  for(int k=1;k<=K;k++){
    if(k>=2)
      for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
      for(int t=0;t<26;t++)
        foc(x,load[i][t]) foc(y,unload[j][t])
          (g[i][j][k]+=f[x->second][y->first][k-2][0])%=P;
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
    for(int s=0;s<2;s++){
      if(s) foc(x,iroad[i]) (f[i][j][k][s]+=f[x->second][j][k-1][s])%=P;
      else foc(x,road[i]) (f[i][j][k][s]+=f[x->second][j][k-1][s])%=P;
    }
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
    for(int s=0;s<2;s++)
      for(int x=1;x<=n;x++)
        for(int t=2;t<=k;t++)
          (f[i][j][k][s]+=g[i][x][t]*f[x][j][k-t][s])%=P;
    (Ans+=f[1][n][k][1])%=P;
  }
  return printf("%d\n",Ans),0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[BZOJ3185][Coci2011][DP]kamion 的相关文章

随机推荐

  • Java项目热部署方案之IDEA-HotSwapAgent和DCEVM大法

    一 环境准备 HotSwapAgent xff08 http hotswapagent org xff09 依赖 DCEVM 而 DCEVM要求jdk版本必须对应 xff0c 如果你用的 jdk1 8 xff0c 首先需要确认安装的是jdk
  • 使用rclone将本机文件或文件夹导入minIO

    一 背景 minio大量文件上传 xff0c 通过console xff0c web端控制台上传的话是可以的 xff0c 但是文件量太大 xff0c 效率很低 xff0c 就想办法上传服务器 xff0c 然后读取服务器文件的方式进行 二 过
  • 记录一次docker容器引起的时间相差8h的问题

    一 背景 系统打印日志时间小8h xff0c 部分插入mysql的日期却大8h xff0c 简直诡异 测试时间是上午10 05 经过排查 xff0c mysql设置的时区 xff0c 链接url设置的时区都是ok的 而且有其他服务时间正常
  • c++常见面试题30道

    转自 xff1a http blog csdn net shihui512 article details 9092439 xff1b 1 new delete malloc free 关系 delete会调用对象的析构函数 和 new 对
  • __attribute__ 机制详解

    attribute 语法的来源 GNU C 的一大特色就是 attribute 机制 attribute 可以设置函数属性 xff08 Function Attribute xff09 变量属性 xff08 Variable Attribu
  • 进程和线程的理解

    一 进程和线程的概念 xff08 一句话概述 xff09 进程 xff1a 我们运行的程序通常会对应一个或多个进程 xff0c 进程是操作系统分配内存的基本单位 线程 xff1a 一个进程通常会包含一个或多个线程 xff0c 线程是操作系统
  • ubuntu中sudo apt-get install 出现 failed to fetch

    在ubuntu中 安装samba时 xff08 sudo apt get install samba xff09 出现 failed to fetch 通过以下方式成功解决了 xff1a 我直接更新了下就解决了 通过sudo apt get
  • Docker删除镜像和容器

    一 删除容器 首先需要停止所有的容器 xff08 只停止单个时把后面的变量改为image id即可 xff09 docker stop docker ps a q 删除所有的容器 xff08 只删除单个时把后面的变量改为image id即可
  • 【读书】只读经典

    本文摘自豆瓣上 八百步 的收集的资料 xff1a http book douban com review 5289501 Ch 1 xff1a 管理 1 弗雷德里克 温斯洛 泰勒著 xff0c 科学管理的基本原理 xff0c 1911年出版
  • 卸载Docker

    一 准备工作 xff1a 1 杀死docker有关的容器 xff1a docker kill docker ps a q 2 删除所有docker容器 xff1a docker rm docker ps a q 3 删除所有docker镜像
  • IDEA2020启动Tomcat控制台中文乱码解决

    IDEA2020启动Tomcat控制台中文乱码解决 1 中文乱码原因 基本上大家安装的windows系统本地语言都是选择中文 xff08 不会有人选择英文吧 xff1f 不会吧 xff1f 不会吧 xff1f xff09 xff0c 也就是
  • MyEclipse配置Tomcat 7

    1 打开步骤 xff1a 窗口 gt 首选项 gt MyEclipse gt Servers gt Tomcat gt Tomcat 7 x 2 配置自己本地的Tomcat 7版本 3 关闭MyEclipse自带的Tomcat服务器 4 启
  • mysql之模糊查询的方法

    Mysql模糊查询正常情况下在数据量小的时候 xff0c 速度还是可以的 xff0c 但是不容易看出查询的效率 xff0c 在数据量达到百万级 xff0c 千万级的甚至亿级时mysql查询的效率是很关键的 xff0c 也是很重要的 一 一般
  • Spring Cloud限流详解

    Spring Cloud限流详解 Spring Cloud Spring Cloud 2017 12 01 在高并发的应用中 xff0c 限流往往是一个绕不开的话题 本文详细探讨在Spring Cloud中如何实现限流 在Zuul上实现限流
  • springboot启动注解

    为什么springboot不需要配置文件就可以启动成功 springboot入口SpringBootApplication是一个启动类 xff0c 主要的注解是以下的三个 xff1a 1 SpringBootConfiguration是一个
  • 如何释放linux的内存

    你们知道怎么释放linux的内存吗不知道的话跟着学习啦小编一起来学习怎么释放linux的内存 释放linux的内存的步骤 Linux下操作频繁时 xff0c 物理内存会被快速用完 xff0c 当操作结束后 xff0c 物理内存没有被正常的释
  • 跨域的五种解决方案详解

    1 跨域解决方案一 cors技术 CORS 全称cross origin resource share xff08 资源共享 xff09 工作原理 xff1a 服务器 在返回响应报文的时候 xff0c 在响应头中 设置一个允许的header
  • MySQL 日期时间类型精确到毫秒

    MySQL 常用的日期时间类型常用的是datetime timestamp 其中datetime占用5个字节 xff08 有些文档中说占用8个字节是不对的 xff0c 默认也不会保存毫秒 xff09 DATETIME和TIMESTAMP两种
  • Spring Boot——Thymeleaf

    哈喽 xff01 大家好 xff0c 我是 xff0c 一位上进心十足的 Java领域博主 xff01 的写作风格 xff1a 喜欢用 通俗易懂 的文笔去讲解每一个知识点 xff0c 而不喜欢用 高大上 的官方陈述 博客的领域是 面向后端技
  • [BZOJ3185][Coci2011][DP]kamion

    考虑转化一下问题 令 f i j k 表示从i到j恰好用了k步 xff0c 并且到j的时候火车厢为空的方案数 那么转移就是 f i j k 61 f a b k 1 f c j k 2 xff0c 转移成立当且仅当存在i gt a的边 xf