QBSELECT - VOI06 Chọn ô
Tác giả: khuc_tuan
Ngôn ngữ: C++
#include <iostream>
using namespace std;
int n;
int a[4][10000];
int f[1<<4], g[1<<4];
int main() {
scanf("%d", &n);
for(int i=0;i<4;++i)
for(int j=0;j<n;++j)
scanf("%d", a[i]+j);
bool duong = false;
int mm = -1000000000;
for(int j=0;j<n;++j)
for(int i=0;i<4;++i) {
if(a[i][j]>0) duong = true;
else mm >?= a[i][j];
memset( g, 0, sizeof(g));
for(int bit=0;bit<(1<<4);++bit) {
if((bit&(1<<i))==0) {
g[bit] = f[bit];
g[bit] >?= f[bit|(1<<i)];
}
else {
if(i==0 || (bit&(1<<(i-1)))==0) {
int nb = (bit | (1<<i)) ^ (1<<i);
g[bit] >?= a[i][j] + f[nb];
}
}
}
memmove( f, g, sizeof(g));
}
if(!duong) cout << mm << endl;
else cout << *max_element( f, f+(1<<4)) << endl;
//system("pause");
return 0;
}