题意简述
有3部车在k个城市间旅游,每次只能移动一部车,去第k个城市的前提是前k-1个城市都去过。
求旅行完k个城市的最短距离
分析
将状态表示出来,直接dp即可
记f[a,b,c]表示三部车分别在a,b,c城市的最短距离(a>b>c)
那么枚举每个可行状态,更新f[a+1,b,c],f[a+1,a,c],f[a+1,b,c]即可
代码
#include<cstdio>
#define fo(i,a,b) for(int i=a;i<=b;i++)
int n,f[120][120][120],a[200][200],te,ans;
// f[i][j][k] i>=j>=k
int main(){
scanf("%d",&n);
fo(i,1,n)
a[i][i]=0x3fffffff;
fo(i,1,n-1)
fo(j,i+1,n){
scanf("%d",&a[i][j]);
//a[j][i]=0x3fffffff;
}
fo(i,1,n)
fo(j,1,n)//1..i
fo(k,1,n)//1..j
f[i][j][k]=0x3fffffff;
f[1][1][1]=0;
fo(i,1,n-1)
fo(j,1,i)
fo(k,1,j){
te=f[i][j][k]+a[i][i+1];//
if (te<f[i+1][j][k])
f[i+1][j][k]=te;
te=f[i][j][k]+a[j][i+1];
if (te<f[i+1][i][k])
f[i+1][i][k]=te;
te=f[i][j][k]+a[k][i+1];
if (te<f[i+1][i][j])
f[i+1][i][j]=te;
}
ans=0x3fffffff;
fo(i,1,n)
fo(j,1,n)
if (f[n][i][j]<ans)
ans=f[n][i][j];
printf("%d\n",ans);
return 0;
}