Mobile Service Page269 线性dp
1.如果直接做的话是
d
p
[
i
]
[
p
o
s
1
]
[
p
o
s
2
]
[
p
o
s
3
]
dp[i][pos1][pos2][pos3]
dp[i][pos1][pos2][pos3],显然超时,将冗余信息除掉后,降了个维度就可以做了。(根本想不到)
2.要注意,同一个点不能两个人同时到达,所以要加个判断语句。
代码:
int dp[1007][maxn][maxn],cost[maxn][maxn],n,m,x[1007];
int main()
{
scanf("%d%d",&n,&m);
rep(i,1,n)rep(j,1,n)scanf("%d",&cost[i][j]);
rep(i,1,m)scanf("%d",&x[i]);
rep(i,0,m)rep(j,1,n)rep(k,1,n)dp[i][j][k]=INF;
dp[0][1][2]=0,x[0]=3;
rep(i,1,m)
{
rep(j,1,n)
{
rep(k,1,n)
{
if (j!=x[i]&&k!=x[i])dp[i][j][k]=min(dp[i][j][k],dp[i-1][j][k]+cost[x[i-1]][x[i]]);
if (x[i-1]!=x[i]&&k!=x[i])dp[i][x[i-1]][k]=min(dp[i][x[i-1]][k],dp[i-1][j][k]+cost[j][x[i]]);
if (x[i-1]!=x[i]&&j!=x[i])dp[i][j][x[i-1]]=min(dp[i][j][x[i-1]],dp[i-1][j][k]+cost[k][x[i]]);
}
}
}
int ans=INF;
rep(i,1,n)rep(j,1,n)ans=min(ans,dp[m][i][j]);
W(ans);
return 0;
}