题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2460
题意不表
题目感想:虽然是简单题吧,但是由于是算法思维和代码能力的练习,所以把它补了,这题的思维真的类似于数字三角形那题,就是逆推dp思想,逆推逆推!校赛两道题都是这个思想,也是一个教训,而且对于每一个算法的理解基础真的要到位,另外还是把题目思路想清楚,再动键盘,真是白给一发。

#include<bits/stdc++.h>
using namespace std;
int t,n;
const int maxn = 1e3+9;
struct node{
    int x,y,z;
    double ans=0.0;
    friend bool operator <(node a,node b){
        return a.z<b.z;
    }
}a[maxn];
int main()
{
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);

        for(int i=1;i<=n;i++){
            scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
        }
        sort(a+1,a+n+1);
        vector<node>v[maxn];
        int num=0;a[0].z=-99999;
        for(int i=1;i<=n;i++){
            if(a[i].z!=a[i-1].z){
                v[++num].push_back(a[i]);
            }
            else{
                v[num].push_back(a[i]);
            }
        }
        for(int i=1;i<num;i++){
            for(int k=0;k<v[i+1].size();k++){
                double q[maxn];int cnt=0;
                for(int j=0;j<v[i].size();j++){
                    int a=v[i][j].x,b=v[i][j].y,c=v[i][j].z;
                    int a1=v[i+1][k].x,b1=v[i+1][k].y,c1=v[i+1][k].z;
                    double temp=sqrt((double)(a1-a)*(a1-a)+(b1-b)*(b1-b)+(c1-c)*(c1-c));
                    q[cnt++]=temp+v[i][j].ans;
                }
                sort(q,q+cnt);
                v[i+1][k].ans=q[cnt-1];
            }
        }
        double ans=0;
        for(int i=0;i<v[num].size();i++){
            ans=max(v[num][i].ans,ans);
        }
        printf("%.3f\n",ans);

    }
    return 0;
}
/* 3 7 0 1 1 0 0 0 0 1 0 0 100 0 0 1000 0 0 1000 1 0 1000 2 */