P1268 树的重量
链接:https://www.luogu.com.cn/problem/P1268
原题:
思路:
原本的思路是通过最长边构建一棵树,然后通过记录每个横坐标的值来模拟每个边的分支。但是这样做太繁琐而且容易分类讨论失误。
看了题解的一个非常巧妙的办法:类似于求LCA的思路。
事实上感觉就像状态转移?类似于DP里面的一种思路,挺好的,不用管整棵树的样子。
代码:
#include<iostream>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
const int N = 140;
int a[N][N];
signed main()
{
IOS;
int n; cin >> n;
for (int i = 1; i < n; i++)
{
for (int j = i + 1; j <= n; j++)
{
cin >> a[i][j];
a[j][i] = a[i][j];
}
}
int ans = a[1][2];
for(int i=3;i<=n;i++)
{
int minn = 0x3f3f3f3f;
for (int j = 2; j <= i - 1; j++)
{
int cal = 0;
cal = (a[1][i] + a[i][j] - a[1][j]) / 2;
minn = min(minn, cal);
}
ans += minn;
}
cout << ans;
return 0;
}