题意:给三辆车,将1~n这n个点依次跑完,也就是说要想到达i+1,必须先到达i,
每两个点之间都有花费,问最小的话费是什么。
思路:设dp[i][j][k],为走的最远的车,次元的车,最近的车在位置i,j,k的时候的最小
花费。具体转移看代码,感觉非常巧妙。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int dp[31][31][31];//分别为走的最远,次远,最近的车的位置
int cost[31][31], n;
int main(){
int T;
scanf("%d", &T);
while(T--){
scanf("%d", &n);
for(int i=1; i<n; i++){
for(int j=i+1; j<=n; j++){
scanf("%d", &cost[i][j]);
}
}
memset(dp, 0x3f, sizeof dp);
dp[1][1][1]=0;
for(int i=1; i<=n; i++){//最远车的位置
for(int j=1; j<=i; j++){//次远车的位置
for(int k=1; k<=j; k++){//最近车的位置
dp[i+1][j][k]=min(dp[i+1][j][k], dp[i][j][k]+cost[i][i+1]);
dp[i+1][i][k]=min(dp[i+1][i][k], dp[i][j][k]+cost[j][i+1]);
dp[i+1][i][j]=min(dp[i+1][i][j], dp[i][j][k]+cost[k][i+1]);
}
}
}
int mn=INF;
for(int j=1; j<=n; j++)
for(int k=1; k<=j; k++)
mn=min(mn, dp[n][j][k]);
printf("%d\n", mn);
}
return 0;
}