洛谷

Sol

首先状态是已经完成的请求数量

这题只有三个员工跑来跑去,只有三个....

一般像这种人数特别少的DP题就会把它们都放到状态里去

于是:f[i][x][y][z]表示现在已经完成了i个请求,一个员工在x,一个员工在y,一个员工在z的最小花费

转移:

f[i+1][pi+1][y][z]=min(f[i+!][pi+1][y][z],f[i][x][y][z]+c(x,pi+1))

f[i+1][x][pi+1][z]=min(f[i+1][x][pi+1][z],f[i][x][y][z]+c(y,pi+1))

f[i+1][x][y][pi+1]=min(f[i+1][x][y][pi+1],f[i][x][y][z]+c(z,pi+1));

注意到,当第i个请求完成时,一定有一个员工位于pi,只需要描述另外两个员工的位置即可以描述整个状态

所以:f[i][x][y]表示现在已经完成了i个请求,一个员工在pi,另外两个员工在x,y的最小花费

转移:

f[i+1][pi][y]=min(f[i+1][pi][y],f[i][x][y]+c(x,pi+1))

f[i+1][x][pi]=min(f[i+1][x][pi],f[i][x][y]+c(y,pi+1))

f[i+1][x][y]=min(f[i+1][x][y],f[i][x][y]+c(pi,pi+1))

最后,其实这里还可以用滚动数组优化

over!

Code

 #include<iostream>
#include<cstdio>
#include<cstring>
#define Rg register
#define il inline
#define db double
#define ll long long
#define inf 2100000000
#define mem(a,b) memset(a,b,sizeof(a));
#define go(i,a,b) for(Rg int i=a;i<=b;i++)
#define yes(i,a,b) for(Rg int i=a;i>=b;i--)
using namespace std;
il int read()
{
int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
int T,l,n,ans=inf,p[],c[][],f[][][];
int main()
{
T=read();
while(T--)
{
l=read(),n=read();mem(f,0x3f);ans=inf;
go(i,,l)go(j,,l)c[i][j]=read();
go(i,,n)p[i]=read();
f[][][]=;p[]=;
go(i,,n-)
go(x,,l)
go(y,,l)
{
if(x==y || x==p[i] || y==p[i])continue;
if(y!=p[i+] && p[i]!=p[i+]) f[i+][p[i]][y]=min(f[i+][p[i]][y],f[i][x][y]+c[x][p[i+]]);
if(x!=p[i+] && p[i]!=p[i+]) f[i+][x][p[i]]=min(f[i+][x][p[i]],f[i][x][y]+c[y][p[i+]]);
if(x!=p[i+] && y!=p[i+]) f[i+][x][y]=min(f[i+][x][y],f[i][x][y]+c[p[i]][p[i+]]);
}
go(x,,l)go(y,,l)ans=min(ans,f[n][x][y]);
printf("%d\n",ans);
}
return ;
}

随机推荐

  1. NetBeans配置

    NetBeans下载链接:https://netbeans.org/downloads/8.2/ 选择PHP×64版本 NetBeans 安装插件Darcula LAF for NetBeansctr ...

  2. ELMo解读(论文 + PyTorch源码)

    ELMo的概念也是很早就出了,应该是18年初的事情了.但我仍然是后知后觉,居然还是等BERT出来很久之后,才知道有这么个东西.这两天才仔细看了下论文和源码,在这里做一些记录,如果有不详实的地方,欢迎指 ...

  3. poj 3601Tower of Hanoi

    Tower of Hanoi Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 1895   Accepted: 646 De ...

  4. springboot activiti工作流简单示例

    最近一直研究springboot,根据工作需求,工作流需要作为一个单独的微服务工程来提供给其他服务调用,现在简单的写下工作流(使用的activiti)微服务的搭建与简单使用 jdk:1.8 数据库:m ...

  5. axis2 wsdl2java工具

    wsdl2java工具使用方法描述: C:\Users\Administrator>wsdl2java -h Using AXIS2_HOME: E:\Apache_Projects\axis2 ...

  6. [转]什么是CNN、RNN、LSTM

    . 全连层 每个神经元输入: 每个神经元输出: (通过一个激活函数) 2. RNN(Recurrent Neural Network) 与传统的神经网络不通,RNN与时间有关. 3. LSTM(Lon ...

  7. H3C OSPF协议工作过程概述

  8. [转]C#操作Memcached帮助类

    在VS中安装Memcached,直接在NuGet下搜索Memcached,选择第一个进行安装: 服务端资源下载地址:https://pan.baidu.com/s/1gf3tupl 接下来开始写程序, ...

  9. UVA 11584 "Partitioning by Palindromes"(DP+Manacher)

    传送门 •题意 •思路一 定义 dp[i] 表示 0~i 的最少划分数: 首先,用马拉车算法求解出回文半径数组: 对于第 i 个字符 si,遍历 j (0 ≤ j < i),判断以 j 为回文中 ...

  10. H3C DHCP中继基本配置