//Accepted 228K 32MS //dp[k][i][j] 表示从1的k号节点到i的j号节点的最小花费 //dp[k][i][j]=min(dp[k][i-1][h]+cost) cost为i的j号节点与i-1的h号节点之间的距离 //ans=min(dp[k][n][i]+cost) cost 为n的i号节点与1的k号节点之间的距离 //事实上,数组的k这一维可以省略 #include <cstdio> #include <cstring> #include <cmath> #include <iostream> using namespace std; ; ; const double inf = 100000000.0; struct Point { int x,y; }p[imax_n][imax_m]; int count[imax_n]; double dp[imax_n][imax_m]; int n; double min(double a,double b) { ) return a; return b; } double getCost(int i,int x,int j,int y) { return sqrt((double )((p[i][x].x-p[j][y].x)*(p[i][x].x-p[j][y].x)+(p[i][x].y-p[j][y].y)*(p[i][x].y-p[j][y].y))); } void Dp() { double ans=inf; ;k<=count[];k++) { memset(dp,,sizeof(dp)); ;i<=n;i++) ;j<=count[i];j++) dp[i][j]=inf; dp[][k]=; ;i<=n;i++) { ;j<=count[i];j++) { //dp[i][j]=inf; ;h<=count[i-];h++) { dp[i][j]=min(dp[i][j],dp[i-][h]+getCost(i-,h,i,j)); } } } ;i<=count[n];i++) ans=min(ans,dp[n][i]+getCost(n,i,,k)); } printf()); } int main() { scanf("%d",&n); ;i<=n;i++) { scanf("%d",&count[i]); ;j<=count[i];j++) { scanf("%d%d",&p[i][j].x,&p[i][j].y); } } Dp(); ; }