测试1T2
题目描述
Lyk去推塔。但是推第n座塔必须先推了第1~n-1座塔。
为了加快速度lyk召唤出了szh和txm。求lyk和他的召唤兽们为了推完所有塔所经过的最短距离。
输入
第一行一个数N,代表一共要去多少个城市。
下面N-1 行,对于第 i 行,有 n-i 个数,表示第 i 个城市分别和第i+1, i+2, i+3,
……, N 的距离(距离<=10000)
输出
一个数,表示最短距离
样例输入
5 1 1 1 2 33 33 33 33 33 33
样例输出
36
提示
Constraints
对于30%,n<=10
对于100%,n<=100
第一遍做时爆搜爆0
DP即可
f[i][j][k]表示推到第i座塔,其余两只怪兽在j,k时的最短距离
f[i+1][j][i]=min(f[i+1][j][i],f[i][j][k]+dist[k][i+1]);
f[i+1][j][k]=min(f[i+1][j][k],f[i][j][k]+dist[i][i+1]);
[i+1][i][k]=min(f[i+1][i][k],f[i][j][k]+dist[j][i+1]);
第一遍暴力floyd预处理出所有点对间的最短距离
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int a[105][105],dp[105][105][105],n; void floyd() { for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) for(int k=j+1;k<=n;k++) if(i!=k&&j!=k&&i!=j) if(a[i][j]+a[j][k]<a[i][k]) a[i][k]=a[i][j]+a[j][k]; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n-i;j++) scanf("%d",&a[i][i+j]); floyd(); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) dp[i][j][k]=0x7FFFFFFF; dp[1][1][1]=0; for(int i=1;i<n;i++) for(int j=1;j<=i;j++) for(int k=1;k<=i;k++) if(dp[i][j][k]!=0x7FFFFFFF) { dp[i+1][j][i]=min(dp[i+1][j][i],dp[i][j][k]+a[k][i+1]); dp[i+1][j][k]=min(dp[i+1][j][k],dp[i][j][k]+a[i][i+1]); dp[i+1][i][k]=min(dp[i+1][i][k],dp[i][j][k]+a[j][i+1]); } int ans=0x7FFFFFFF; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) ans=min(ans,dp[n][i][j]); printf("%d\n",ans); }
题意难懂~~