在 #9 WA 了,求 hack
#include<bits/stdc++.h>
using namespace std;
#define gc (p1==p2&&(p2=(p1=buf)+fread(buf,1,1000001,stdin))?EOF:*p1++)
char buf[1000009],*p1=buf,*p2=buf;
struct Node{int u,v,w;inline bool operator<(const Node &other) const{return w<other.w;}}a[1999009];
typedef pair<int,int> pii;
vector<pii> b[2009];
int n,f[2009][2009],pa[2009],r=1,l;
queue<int> q;
bool vst[2009];
int dp[2009];
inline int find(int x){return x==pa[x]?x:pa[x]=find(pa[x]);}
inline int rd(){int x=0,c=gc;while(c<48||c>57) c=gc;while(c>47&&c<58) x=(x<<3)+(x<<1)+(c^48),c=gc;return x;}
int main(){
n=rd(),iota(pa,pa+n,0);
for(int i=0;i<n;++i) for(int j=0;j<n;++j) f[i][j]=rd();
for(int i=0;i<n;++i) if(f[i][i]) return puts("NO"),0;
for(int i=0;i<n;++i) for(int j=i+1;j<n;++j) if(f[i][j]!=f[j][i]||f[i][j]<1) return puts("NO"),0;
for(int i=0;i<n;++i) for(int j=i+1;j<n;++j) a[l].u=i,a[l].v=j,a[l].w=f[i][j],++l;
sort(a,a+l);
for(int i=0;i<l;++i) if(find(a[i].u)!=find(a[i].v)){pa[pa[a[i].u]]=pa[a[i].v],b[a[i].u].push_back((pii){a[i].v,a[i].w}),b[a[i].v].push_back((pii){a[i].u,a[i].w}),++r;if(r==n) break;}
for(int i=0;i<n;++i){
memset(vst,0,sizeof(vst)),q.push(i),vst[i]=1,dp[i]=0;
while(!q.empty()){
int e=q.front();
q.pop();
for(pii &x:b[e]) if(!vst[x.first]) dp[x.first]=dp[e]+x.second,dp[x.first]!=f[i][x.first]&&(puts("NO"),exit(0),0),q.push(x.first),vst[x.first]=1;
}
}
return puts("YES"),0;
}