悬关&萌新求助:WA#1
查看原帖
悬关&萌新求助:WA#1
311306
dk_qwq楼主2023/10/7 21:20

RT,这是调这份代码的第8节课了,球球了/kk https://www.luogu.com.cn/record/128190842

#include<iostream>
#include<cstdio>
#include<vector>
#define pb push_back
#include<unordered_map>
using namespace std;
namespace INPUT{
	char buf[1<<20],*p1,*p2;
	#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
}
using namespace INPUT;
template <typename T>
T read(){
	T x=0,p=1;
	char ch=gc();
	for(;ch<'0'||ch>'9';ch=gc())
		if(ch=='-') p=-1;
	for(;'0'<=ch&&ch<='9';ch=gc())
		x=(x<<3)+(x<<1)+(ch^48);
	return x*p;
}
const int N=10;
unordered_map<int,int>last,now;
int bits[N];
int n,_map[N][N];
void print(int x){
	for(int i=1;i<=n;i++)
		printf("%d",(x>>(bits[i]))%8);
}
int main(){
	// freopen("P3886.in","r",stdin);
	// freopen("P3886.out","w",stdout);
	for(int i=0;i<N;i++) bits[i]=i*3;
	n=read<int>();
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)
		_map[i][j]=read<int>();

	int ans=-1e9;
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)
		ans=max(ans,_map[i][j]);
	if(ans<0) return printf("%d\n",ans),0;

	now[0]=0;
	auto put=[](int state,int val){
		if(!now.count(state)) now[state]=val;
		now[state]=max(now[state],val);
	};
	auto encode=[&ans](int state,int res){
		int vis[N];
		for(int i=1;i<=n;i++) vis[i]=0;
			int cnt=0;
		for(int i=1;i<=n;i++){
			int x=(state>>bits[i])%8;
			if(x==0) continue;
			if(!vis[x]) vis[x]=++cnt;
			state+=vis[x]*(1<<bits[i])-x*(1<<bits[i]);
		}
		if(cnt<2) ans=max(ans,res);
		return state;
	};
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){
		swap(last,now),now.clear();
		for(auto ed:last){
			int state=ed.first,lastans=ed.second;
			int b1=(state>>bits[j-1])%8,b2=(state>>bits[j])%8;
			if(j==1) b1=0;
			if(b1==0&&b2==0){
				put(encode(state,lastans),
					lastans);
				put(encode(state+7*(1<<bits[j]),lastans+_map[i][j]),
					lastans+_map[i][j]);
			}
			else if(b1&&b2==0){
				put(encode(state,lastans),
					lastans);
				put(encode(state+b1*(1<<bits[j]),lastans+_map[i][j]),
					lastans+_map[i][j]);
			}
			else if(b1==0&&b2){
				int cnt=0;
				for(int k=1;k<=n;k++)
					if((state>>bits[k])%8==b2) cnt++;
				if(cnt>=2)
					put(encode(state-b2*(1<<bits[j]),lastans),
						lastans);
				put(encode(state,lastans+_map[i][j]),
					lastans+_map[i][j]);
			}
			else if(b1&&b2){
				int cnt=0;
				for(int k=0;k<=n;k++)
					if((state>>bits[k])%8==b2) cnt++;
				if(cnt>=2)
					put(encode(state-b2*(1<<bits[j]),lastans),
						lastans);

				for(int k=1;k<=n;k++) if((state>>bits[k])%8==b1)
					state+=b2*(1<<bits[k])-b1*(1<<bits[k]);
				put(encode(state,lastans+_map[i][j]),
					lastans+_map[i][j]);
			}
			else puts("?");
		}
	}
	cout<<ans<<endl;
}
2023/10/7 21:20
加载中...