洛谷

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. Python字节码介绍

    了解 Python 字节码是什么,Python 如何使用它来执行你的代码,以及知道它是如何帮到你的.如果你曾经编写过 Python,或者只是使用过 Python,你或许经常会看到 Python 源代码 ...

  2. tomcat不能多次startup.sh,异常时直接,分析logs目录下的日志。

    tomcat不能多次startup.sh,异常时直接干掉其进程. 分析logs目录下的日志.

  3. hdu 5745 La Vie en rose(2016多校第二场)

    La Vie en rose Time Limit: 14000/7000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  4. jQuery的引入和使用

    https://www.cnblogs.com/sandraryan/ 前端代码优化:无效循环越少越好,DOM节点操作越少越好,HTTP请求越少越好 jq是一个js库.(不是框架) JQ优点 1. 方 ...

  5. 9 个必须知道的实用 PHP 函数和功能 [转]

    9 个必须知道的实用 PHP 函数和功能 [转] 即使使用 PHP 多年,也会偶然发现一些未曾了解的函数和功能.其中有些是非常有用的,但没有得到充分利用.并不是所有人都会从头到尾一页一页地阅读手册和函 ...

  6. java框架之shiro

    #shiro简介 一.简介 Apache Shiro 是一个强大而灵活的开源安全框架,可以用于应用程序的身份验证,授权,会话管理和加密. Authentication:有时也简称为“登录”,这是一个证 ...

  7. Python--day30--软件开发架构

    软件开发架构: C/S架构: B/S架构: B/S架构和C/S架构的关系:

  8. Spring Data Jpa一对多单向映射

    /** @author StormMaybin @date 2017-01-17 */ 生命不息,奋斗不止! 一对多映射关系 在JPA中,用@OneToMany来标识一对多的关系.实现一对多的单向关联 ...

  9. js 制作分页

    如图所示 在html中调用方法 getpage(7, 1, 1, 'URL') 1.page.js文件 代码 function getpage(count, countPage, pageIndex, ...

  10. linux主次编号

    字符设备通过文件系统中的名子来存取. 那些名子称为文件系统的特殊文件, 或者设备文 件, 或者文件系统的简单结点; 惯例上它们位于 /dev 目录. 字符驱动的特殊文件由使用 ls -l 的输出的第一 ...