开关问题

给定两个0/1序列 要求经过若干操作从一个序列变成另一个序列 其中给定若干组关系 操作一个的时候另一个也会变化 每个位置只能被主动操作一次 关系不具有传递性
求方案数

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

const int eps=1e-8;
const int N=15;
double a[N][N],b[N],c[N][N];
int n;
void SWAP(int x,int y)
{
	for(int i=1;i<=n;i++) swap(c[x][i],c[y][i]);
	swap(b[x],b[y]);
}

void sub(int x,int y,double k)//x-y*k
{
	for(int i=1;i<=n;i++) c[x][i]-=c[y][i]*k;
	b[x]-=b[y]*k;
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n+1;i++) 
		for(int j=1;j<=n;j++) scanf("%lf",&a[i][j]);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		 	c[i][j]=2*(a[i][j]-a[i+1][j]),b[i]+=a[i][j]*a[i][j]-a[i+1][j]*a[i+1][j];
	for(int i=1;i<=n;i++)
	{
		if( fabs(c[i][i])<eps ) 
		for(int j=i+1;j<=n;j++)
			if(fabs(c[j][i])>eps){ SWAP(i,j); break;}
		for(int j=1;j<=n;j++)
		{
			if(i==j) continue;
			sub(j,i,c[j][i]/c[i][i]);
		}
	}
		
	for(int i=1;i<=n;i++) printf("%.3lf ",b[i]/c[i][i]);
	return 0;
}

很抽象的高斯消元
用矩阵表示连接关系 \(x=0/1\)表示是否操作
01矩阵可以状态压缩
序列变化的变化可以用方程来表示

posted @ 2022-02-10 11:30  __iostream  阅读(36)  评论(0)    收藏  举报