dp[i][j][k]代表三辆车按地点从小到大依次为i,j,k,从初始状态到达此状态的最少时间
按照j==k或j==k-1,j<k-1分类
#include <iostream>
#include <cstdio>#include <cstring>
#define MAX 200000000
#define maxn 35
using namespace std;
int dis[maxn][maxn];
int dp[maxn][maxn][maxn];
int M,N;
int DP()
{dp[1][1][1]=0;
int mintime=MAX;
for(int i=1;i<=N;i++)
{
for(int j=i;j<=N;j++)
{
for(int k=j;k<=N;k++)
{
if(i==1&&j==1&&k==1)continue;
if(j==k-1||j==k)
{
int temp=MAX;
for(int t=1;t<k;t++)
{
int tmp=k-t;
int d=dis[k-t][k];
if(tmp>i)
temp=min(temp,dp[i][tmp][j]+d);
else
temp=min(temp,dp[tmp][i][j]+d);
}
dp[i][j][k]=temp;
if(k==N)
{
mintime=min(mintime,dp[i][j][k]);
}
}
else
{
int temp=MAX;
int d=dis[k-1][k];
temp=min(temp,dp[i][j][k-1]+d);
dp[i][j][k]=temp;
if(k==N)
{
mintime=min(mintime,dp[i][j][k]);
}
}
}
}
}
return mintime;
}
int main()
{
scanf("%d",&M);
for(int cas=1;cas<=M;cas++)
{
memset(dp,0x3f,sizeof(dp));
scanf("%d",&N);
for(int i=1;i<=N-1;i++)
{
for(int j=i+1;j<=N;j++)
{
scanf("%d",&dis[i][j]);
dis[j][i]=dis[i][j];
}
}
cout<<DP()<<endl;
}
return 0;
}