洛谷

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. Linux服务部署:nginx服务 nfs服务

    nginx服务 源码安装: yum install gcc-* glibc-* openssl openssl-devel pcre pcre-devel zlib zlib-devel -ylsta ...

  2. ArcGIS中的连接和关联表

    大多数数据库的设计指导方针都倾向于将数据库组织成多个表 - 每个表关注一个特定的主题 - 而非一个包含所有必要字段的大型表.设置多个表可以避免数据库中的信息发生重复,因为只会将信息在一个表中存储一次. ...

  3. 《C语言深度解剖》学习笔记之符号

    第2章 符号 1.注释符号 编译器会将注释剔除,用空格代替原来的注释 y=x /* p; 编译器提示出错的原因:实际上,编译器会把“/*”当作一段注释的开始,直到出现“*/”为止. [规则 2-1]注 ...

  4. mysql查询包含逗号的数据,并逗号拆分为多行展现

    在做系统开发的时候,有可能是由于之前的遗留问题,导致在数据入库的时候,将多个数据以逗号分隔的实行,存储在一条数据中,例如: ID VALUE 1 yang,zheng,song 2 zhao,qian ...

  5. 03寻找最小的k个数

    题目描述:查找最小的k个元素         题目:输入n个整数,输出其中最小的k个.         例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 1:最简单 ...

  6. codeforces2B.The least round way 题解 动态规划/模拟

    题目出处:http://codeforces.com/problemset/problem/2/B 题目描述 给你一个 \(n \times n\) 的二维数组,它包含的元素都是非负整数.你需要寻找一 ...

  7. 2018-8-10-git-使用-VisualStudio-比较分支更改

    title author date CreateTime categories git 使用 VisualStudio 比较分支更改 lindexi 2018-08-10 19:16:52 +0800 ...

  8. C# 总结复习---知识点

    知识点: 1. 转义字符: Console.WriteLine("C:\\asdfg\\sdfd");   ----    "\\"是转义斜杠后面紧跟着的字符C ...

  9. SpringBoot整合Redis乱码原因及解决方案

    问题描述:springboot使用spring data redis存储数据时乱码 redis key/value 出现\xAC\xED\x00\x05t\x00\x05 问题分析: 查看RedisT ...

  10. sci,ei,istp三大科技文献检索系统

    印刷版(SCI) 双月刊 ,500种 联机版(SciSearch) 周更新 ,600种 光盘版(带文摘)(SCICDE) 月更新 ,500种(同印刷版) 网络版(SCIExpanded) 周更新 ,6 ...