← Home
#include<iostream>
using namespace std;
int N;
long long S[201][201];
long long dp[201][201];
int root[201][201];
int pr[201];
void dfs(int l,int r,int p)
{
	if(l==r)return;
	int v=root[l][r];
	pr[v]=p+1;
	dfs(l,v,v);
	dfs(v+1,r,v);
}
main()
{
	cin>>N;
	for(int i=1;i<=N;i++)for(int j=1;j<=N;j++)
	{
		int c;cin>>c;
		S[i][j]=c+S[i-1][j]+S[i][j-1]-S[i-1][j-1];
	}
	for(int k=1;k<=N;k++)for(int i=0;i+k<=N;i++)
	{
		dp[i][i+k]=1e18;
		for(int l=i;l<i+k;l++)
		{
			long long now=dp[i][l]+(S[l][N]-S[i][N])-(S[l][l]-S[i][l]-S[l][i]+S[i][i])+
				dp[l+1][i+k]+(S[i+k][N]-S[l+1][N])-(S[i+k][i+k]-S[l+1][i+k]-S[i+k][l+1]+S[l+1][l+1]);
			if(dp[i][i+k]>now)
			{
				dp[i][i+k]=now;
				root[i][i+k]=l;
			}
		}
	}
	dfs(0,N,-1);
	for(int i=0;i<N;i++)cout<<pr[i]<<(i+1==N?"\n":" ");
}