dalao求调
  • 板块CF1666J Job Lookup
  • 楼主dxbt
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/11/8 18:57
  • 上次更新2023/10/27 03:44:11
查看原帖
dalao求调
189410
dxbt楼主2022/11/8 18:57

这是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;
}
2022/11/8 18:57
加载中...