这是WA#7的代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int ans[210],sum[209][209],arr[209][209],mi[209][209];
int f[209][209];//f[i][j]表示i-j节点的tree对整棵树的价值
int query(int a,int b,int c,int d)
{
return (a<=b&&c<=d)*(sum[b][d]-sum[a-1][d]-sum[b][c-1]+sum[a-1][c-1]);
}//排除单个儿子
int read()
{
int x=0;char ch=getchar();
while(ch<'0' || ch>'9')ch=getchar();
while(ch<='9' && ch>='0')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x;
}
void bre(int l,int r,int father)
{
if(l>r) return;
if(l==r){ans[l]=father;return ;}
ans[mi[l][r]]=father;
bre(l,mi[l][r]-1,mi[l][r]);
bre(mi[l][r]+1,r,mi[l][r]);
}
signed main()
{
int n=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
arr[i][j]=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+arr[i][j];
for(int i=1;i<=n;i++)mi[i][i]=i,f[i][j]=1e18;
for(int i=n;i>=1;i--)
for(int j=i+1;j<=n;j++)
{
for(int k=i;k<=j;k++)
{
int kkk=f[i][k-1]+f[k+1][j];
kkk+=query(i,k-1,1,i-1)+query(i,k-1,k,n)+query(k+1,j,1,k)+query(k+1,j,j+1,n);
if(kkk<f[i][j])f[i][j]=kkk,mi[i][j]=k;
}
}
bre(1,n,0);
for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
return 0;
}
但把f数组初始化改了后就AC了
#include<bits/stdc++.h>
#define int long long
using namespace std;
int ans[210],sum[209][209],arr[209][209],mi[209][209];
int f[209][209];//f[i][j]表示i-j节点的tree对整棵树的价值
int query(int a,int b,int c,int d)
{
return (a<=b&&c<=d)*(sum[b][d]-sum[a-1][d]-sum[b][c-1]+sum[a-1][c-1]);
}//排除单个儿子
int read()
{
int x=0;char ch=getchar();
while(ch<'0' || ch>'9')ch=getchar();
while(ch<='9' && ch>='0')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x;
}
void bre(int l,int r,int father)
{
if(l>r) return;
if(l==r){ans[l]=father;return ;}
ans[mi[l][r]]=father;
bre(l,mi[l][r]-1,mi[l][r]);
bre(mi[l][r]+1,r,mi[l][r]);
}
signed main()
{
int n=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
arr[i][j]=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+arr[i][j];
for(int i=1;i<=n;i++)mi[i][i]=i;
for(int i=n;i>=1;i--)
for(int j=i+1;j<=n;j++)
{
f[i][j]=1e18;
for(int k=i;k<=j;k++)
{
int kkk=f[i][k-1]+f[k+1][j];
kkk+=query(i,k-1,1,i-1)+query(i,k-1,k,n)+query(k+1,j,1,k)+query(k+1,j,j+1,n);
if(kkk<f[i][j])f[i][j]=kkk,mi[i][j]=k;
}
}
bre(1,n,0);
for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
return 0;
}