C. Boboniu and Bit Operations(664 div2 비트 연산/dp)
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;
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
백준 10844번 쉬운 계단 수 - node.js
문제 설명
계단수: 인접한 모든 자리의 차이가 1인 수 (EX.
로직 설명
N = 2일 때 가능한 계단수를 생각해보자.
해당 숫자들을 보면 십의자리 숫자들은 일의자리 숫자가 무엇이 오는지에 따라 올 수 있는 단어들이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
#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;
}
}
}
#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;
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
백준 10844번 쉬운 계단 수 - node.js문제 설명 계단수: 인접한 모든 자리의 차이가 1인 수 (EX. 로직 설명 N = 2일 때 가능한 계단수를 생각해보자. 해당 숫자들을 보면 십의자리 숫자들은 일의자리 숫자가 무엇이 오는지에 따라 올 수 있는 단어들이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.