1 条题解

  • 0
    @ 2026-7-4 18:07:52

    #include <cstdio>
    #include <iostream>
    using namespace std;
    const int M = 505;
    #define int long long
    const int inf = 1e18;
    int read()
    {
    	int x=0,f=1;char c;
    	while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
    	while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
    	return x*f;
    }
    int n,ans,a[M][M],b[M][M],f[M][M];
    void upd(int &x,int y) {x=min(x,y);}
    int val(int k,int j,int i)
    {
    	return b[j+1][i]+a[n][j]-a[i][j]-a[n][k]+a[i][k];
    }
    signed main()
    {
    	n=read();ans=inf;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			if(i^j) a[i][j]=read();
    	for(int l=n;l>=1;l--)
    		for(int r=l;r<=n;r++)
    			b[l][r]=b[l+1][r]+b[l][r-1]
    				-b[l+1][r-1]+a[l][r];
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
    	for(int i=1;i<n;i++)
    	{
    		f[i][0]=val(0,0,i);
    		upd(ans,f[i][0]+val(0,i,n));
    		for(int j=1;j<i;j++)
    		{
    			f[i][j]=inf;
    			for(int k=0;k<j;k++)
    				upd(f[i][j],f[j][k]+val(k,j,i));
    			upd(ans,f[i][j]+val(j,i,n));
    		}
    	}
    	printf("%lld\n",ans);
    }
    
    
    • 1

    信息

    ID
    8593
    时间
    2000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者