Mobile Service(dp)
题目大意
一个公司的三个员工分别在1,2,3,现在从一个位置q前往一个地方p需要代价c(q,p).现在有一些任务地点需要依次每次有一个人前往,问最小代价
解题思路
很明显的一个四维DP,但是直接开四维的话空间和时间都不行,但是发现每个时间都至少有一个员工位于指定地点,由此可以优化成3维,只要简单地每次枚举上一次任务中除了在制定地点的人剩余的两个人的位置即可
AC代码
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int size=205;
int a[size][size];
int dp[1005][size][size];
int main()
{
int l,n;
scanf("%d%d",&l,&n);
for(int i=1;i<=l;i++)
{
for(int j=1;j<=l;j++)
{
scanf("%d",&a[i][j]);
}
}
for(int i=0;i<=n;i++)
for(int j=1;j<=l;j++)
for(int k=1;k<=l;k++)
dp[i][j][k]=inf;
int lasl=3;
dp[0][1][2]=0;
int q;
for(int _=1;_<=n;_++)
{
scanf("%d",&q);
for(int i=1;i<=l;i++)
{
for(int j=1;j<=l;j++)
{
if(i!=q&&j!=q)dp[_][i][j]=min(dp[_][i][j],dp[_-1][i][j]+a[lasl][q]);
if(lasl!=q&&j!=q)dp[_][lasl][j]=min(dp[_][lasl][j],dp[_-1][i][j]+a[i][q]);
if(i!=q&&lasl!=q)dp[_][i][lasl]=min(dp[_][i][lasl],dp[_-1][i][j]+a[j][q]);
}
}
lasl=q;
}
int ans=inf;
for(int i=1;i<=l;i++)
for(int j=1;j<=l;j++)
ans=min(ans,dp[n][i][j]);
cout<<ans<<endl;
}