$SP703\ Mobile\ Service\ DP$
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 ;
}
随机推荐
- composer基本使用
一.Composer的安装 1.下载Composer 2.Composer安装 1).Composer安装前请确保已经安装了php:打开命令行窗口输入php -v可以查看php的当前版本号. 3.局部 ...
- @loj - 2483@「CEOI2017」Building Bridges
目录 @desription@ @solution@ @accepted code@ @details@ @another solution@ @another code@ @desription@ ...
- 修改UISearchBar背景
转载:http://blog.csdn.net/favormm/archive/2010/11/30/6045463.aspx UISearchBar是由两个subView组成的,一个是UISearc ...
- @noi.ac - 506@ 强连通分量
目录 @description@ @solution@ @accepted code@ @details@ @description@ 有一天你学了一个叫能求出有向图中所有的强连通分量的算法,你决定将 ...
- js判断浏览设备是 手机端,电脑端还是平板端
console.log(navigator.userAgent); var os = function() { var ua = navigator.userAgent, isWindowsPhone ...
- Cutting Bamboos 主席树+二分+前缀和
二分第x次砍的位置,然后用线段树查询小于这个位置的数的个数和值的和.然后判断即可 注意!!!主席树是通过动态开点实现的,本身已经不用再从1开始了,而本题开的范围也应该是0,100000 而不是1,10 ...
- Project Euler Problem 5-Smallest multiple
对每个数字分解素因子,最后对每个素因子去其最大的指数,然后把不同素因子的最大指数次幂相乘,得到的就是最小公倍数 python不熟练,代码比较挫 mp = {} def process(n): i = ...
- 洛谷P1288 取数游戏II 题解 博弈论
题目链接:https://www.luogu.org/problem/P1288 首先,如果你的一边的边是 \(0\) ,那么你肯定走另一边. 那么你走另一边绝对不能让这条边有剩余,因为这条边有剩余的 ...
- jq常用事件
https://www.cnblogs.com/sandraryan/ click(); 点击事件 dblclick(); 双击事件 $('.box').dblclick(function(){ al ...
- JS精度问题,解决方案 math.js
JS精度问题 Vue中使用 解决方案 math.js npm install mathjs import { create, all } from 'mathjs' const config = ...