20pts求调
查看原帖
20pts求调
788573
lxc0530楼主2025/1/28 09:00
#ifndef ONLINE_JUDGE
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#endif
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '/n'
#define pair<int,int> pii
int n,m,f[55][1<<9][1<<9],f1[55][1<<9][1<<9],ans=0x3f3f3f3f,sum=0x3f3f3f3f,a[55][55];
int get(int i,int x)
{
	int sum=0,t=0;
	while(x)
	{
		t++;
		if(x%2==1)sum+=a[i][t];
		x=x/2;
	}
	return sum;
}

int get2(int x)
{
	int sum=0,t=0;
	while(x)
	{
		t++;
		if(x%2==1)sum++;
		x=x/2;
	}return sum;
}
int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j];
	memset(f,0x3f,sizeof f);
	for(int i=0;i<(1<<m);i++) f[1][0][i]=get(1,i),f1[1][0][i]=get2(i);
	for(int i=2;i<=n;i++)
		for(int j=0;j<(1<<m);j++)
			for(int k=0;k<(1<<m);k++)
			{
				if(f[i-1][j][k]==0x3f3f3f3f) continue;
				for(int l=0;l<(1<<m);l++)
				{
					if((j|k|l|(k<<1)|(k>>1))&((1<<m)-1)==((1<<m)-1))
					{
						if(f[i][k][l]>f[i-1][j][k]+get(i,l))
						{
							f[i][k][l]=f[i-1][j][k]+get(i,l);
							f1[i][k][l]=f1[i-1][j][k]+get2(l);
						}
						else if(f[i][k][l]==f[i-1][j][k]+get(i,l))
						{
							f1[i][k][l]=min(f1[i][k][l],f1[i-1][j][k]+get2(l));
	  					}
					}
				}
			}
	for(int i=0;i<(1<<m);i++)
		for(int j=0;j<(1<<m);j++)
		{
			if((i|j|(j>>1)|(j<<1)&((1<<m)-1))==((1<<m)-1))
			{
				if(ans>f[n][i][j])
				{
					ans=f[n][i][j];
					sum=f1[n][i][j];
				}
				else if(ans==f[n][i][j])sum=min(sum,f1[n][i][j]);
			}
		}
 	cout<<sum<<" "<<ans;
	return 0;
}

2025/1/28 09:00
加载中...