C. Boboniu and Bit Operations(664 div2 비트 연산/dp)

12978 단어 CFDP

C. Boboniu and Bit Operations


제목: 두 개의 비음정수 그룹 a, b를 제시하고 길이는 각각 n, m이다.i, j i, j i, j에 c i = a i ci =a_i ci​=ai​& b j b_jbj, c1∣c2∣c3 구하세요......∣cnc1|c_2|c_3……|c_nc1∣c2∣c3......∣cn의 최소값.1 ≤ n , m ≤ 200 1\le n,m\le 200 1≤n,m≤200, 0 ≤ a i < 2 9 0\le a_i < 2^9 0≤ai​<29, 0 ≤ b i < 2 9 0\le b_i < 2^9 0≤bi​<29. 사고방식: 본 문제는 두 가지 착안점이 있다.1. a i와 b i a로 인해i와 biai와 b는 모두 9자리 2진수를 초과하지 않기 때문에 작은 것부터 큰 것까지 답안ans를 일일이 열거할 수 있다. ci∣ans===ansci|ans==ans ci ∣ans==ans 가 정답입니다.(위치나 연산의 성질 2. 표현식의 값에 대해 가능한 모든 결과를 직접 폭력적으로 계산한 다음에 가장 작은 것을 취한다. 결과는 직접 dp로 상태를 옮길 수 있기 때문이다.
Code1:
#include
using namespace std;
const int N = 210;

int a[N],b[N];

int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++) cin>>b[i];
	for(int i=0;i<(1<<10);i++){
		int num=0;
		for(int j=1;j<=n;j++){
			int flag = 0;
			for(int k=1;k<=m;k++){
				if(((a[j]&b[k])|i)==i) flag=1;
			}
			if(flag) num++;
		}
		if(num==n) {
			cout<<i<<"
"
;return 0; } } }

Code2:
#include
using namespace std;
const int N = 210,M=1<<10;
int a[N],b[N],dp[N][M];

int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++) cin>>b[i];
	dp[0][0]=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			int add = a[i]&b[j];
			for(int k=0;k < M;k++)
			if(dp[i-1][k]) dp[i][k|add]=1;
		}
	}
	for(int i=0;i<M;i++){
		if(dp[n][i]){
			cout <<i;
			return 0;
		}
	}
}

좋은 웹페이지 즐겨찾기