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;
}

Download