题目标签:动态规划
题目描述:总共有N个地点,编号1~N,三个汽车开始在位置1,要把一些杂志送到2~N,在同一时间只能有一个车在运输,送到位置K之前必须先把2~K-1送完。给出位置 I 到位置 J 耗费的时间D[I][J], 求将所有的杂志送完需要的最小时间。
思路:
动态规划:dp[i][j][k] (i<j<k) 表示三个车位于i,j,k时耗费的最小时间
转移方程:由dp[i][j][k]可以推出dp[i][j][k+1]、dp[i][k][k+1]、dp[j][k][k+1]
最后在dp[i][j][N]里找一个最小的花费即为所求
code:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int dp[32][32][32];
int dis[32][32];
int n,ca;
int main()
{
scanf("%d",&ca);
while(ca--)
{
memset(dis,0,sizeof(dis));
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
scanf("%d",&dis[i][j]);
memset(dp,0x3f,sizeof(dp));
dp[1][1][2]=dis[1][2];
dp[1][1][1]=0;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
for(int k=j;k<n;k++)
{
dp[i][j][k+1]=min(dp[i][j][k+1],dp[i][j][k]+dis[k][k+1]);
dp[i][k][k+1]=min(dp[i][k][k+1],dp[i][j][k]+dis[j][k+1]);
dp[j][k][k+1]=min(dp[j][k][k+1],dp[i][j][k]+dis[i][k+1]);
}
}
}
int mi=0x7fffffff;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
mi=min(mi,dp[i][j][n]);
printf("%d\n",mi);
}
return 0;
}