洛谷

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. ModuleNotFoundError: No module named 'tools.nnwrap' pytorch 安装

    https://pytorch.org/get-started/locally/ pytorch 主页选择后安装

  2. 从开源小白到 Apache Member,我的成长之路

    我们走过的每一步路,都会留下印记,越坚实,越清晰. 近日,Apache 软件基金会(ASF)官方 Blog 宣布全球新增 40 位 Apache Member,张乎兴有幸成为其中一位. 目前,全球共有 ...

  3. @codeforces - 631E@ Product Sum

    目录 @desription@ @solution@ @accepted code@ @details@ @desription@ 给定一个序列 a,定义它的权值 \(c = \sum_{i=1}^{ ...

  4. ASCII代码表

    >>ASCII代码表<<

  5. 9-6 UVa 11400

    参考 http://www.cnblogs.com/Kiraa/p/5510757.html http://www.cnblogs.com/zhaopAC/p/5159950.html 根据题目说明中 ...

  6. Linux环境下第一次提交项目

    Linux环境下第一次提交项目: vi 日记 新增一个文件名为“日记”的文件 git status 工作区的状态 git add 日记 建立跟踪 git commit 提交变更 ----------- ...

  7. Python--day62--编辑出版社功能

    1,Django项目主要用到的文件

  8. Python--day40--threading模块

    import time from threading import Thread class MyThread(Thread): def __init__(self,arg): super().__i ...

  9. zshrc配置

    大部分没有改动 # If you come from bash you might have to change your $PATH. # export PATH=$HOME/bin:/usr/lo ...

  10. java.util.NoSuchElementException: No value present

    错误: java.util.NoSuchElementException: No value present 原因: 经查询博客Java 8 Optional类深度解析发现,究其原因为: 在空的Opt ...