const int maxn = 2e3+5; int dp[maxn][maxn]; int c[maxn][maxn]; int main () { int n;cin>>n; memset(dp,0x3f,sizeof(dp)); for (int i=1;i<=n;i++) { for (int j=i;j<=n;j++) cin>>c[i][j]; dp[i][i] = c[i][i]; } for (int len=2;len<=n;len++) { for (int i=1;i+len-1<=n;i++) { int j = i+len-1; for (int k=i;k<=j;k++) { int cost = 0; if (k!=i) cost += dp[i][k-1]; if (k!=j) cost += dp[k+1][j]; dp[i][j] = min(dp[i][j],cost+c[i][j]); dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]); } } } cout<<dp[1][n]<<endl; }
#include"bits/stdc++.h" typedef long long ll; using namespace std;
const int maxn = 2e3+5; int f[maxn]; int cost[maxn][maxn]; int _find (int x) { if (f[x]==x) return x; f[x] = _find(f[x]); return f[x]; } struct Edge { int u,v,w; }; vector<Edge> v; bool cmp (Edge a, Edge b) { return a.w<b.w; } ll Kruskal (int n) { sort(v.begin(),v.end(),cmp); int cnt = 0; ll ans = 0; for (int i=0;i<v.size();i++) { int U = v[i].u; int V = v[i].v; int W = v[i].w; int fu = _find(U); int fv = _find(V); if (fu==fv) continue; f[fu] = fv; ans += W; cnt++; if (cnt==n) return ans; } }
int main () { int n;cin>>n; for (int i=1;i<=n+1;i++) f[i] = i; for (int i=1;i<=n;i++) { for (int j=i;j<=n;j++) { cin>>cost[i][j+1]; v.push_back({i,j+1,cost[i][j+1]}); } } cout<<Kruskal(n)<<endl; }