Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Zadatak: Kule
- http://bit.ly/zadatak-kule
- Složenost: << faktorijelna zbog memoizacije!
- Datum: 2013-03-01
- Autor: Goran Žužić, HSIN
- Ponuđeno rješenje: Kristijan Burnik, udruga informatičara Božo Težak
- Gmail: kristijanburnik
- */
- #include <iostream>
- #include <cstdlib>
- #include <cmath>
- using namespace std;
- int n;
- int a[20][20];
- int sums[0x100000] = {0};
- int maxsuma(int free,int size) {
- int saved = sums[free];
- if (saved > 0) return saved;
- if (size == 2) {
- int r[2] = {n-2,n-1};
- int c[2] = {0,0};
- int cc = 0;
- int bits = free;
- for (int i = 0; i < n && cc<2; i++) {
- if (bits & 1) {
- c[cc] = i;
- cc++;
- }
- bits >>= 1;
- }
- return (
- sums[free] = max (
- a[ r[0] ][ c[0] ] + a[ r[1] ][ c[1] ] ,
- a[ r[1] ][ c[0] ] + a[ r[0] ][ c[1] ]
- )
- );
- }
- int r = n - size;
- int max = 0;
- int bits = free;
- int onecount = 0;
- for (int i = 0; i < n && onecount < size; i++) {
- if (bits & 1) {
- int suma = a[r][i] + maxsuma(free - (1 << i), size - 1);
- if (suma > max) max = suma;
- onecount++;
- }
- bits >>= 1;
- }
- return sums[free] = max ;
- }
- int main(void) {
- cin >> n;
- for (int i = 0 ; i < n; i++)
- for (int j = 0 ; j < n; j++)
- cin >> a[i][j];
- int free = (1 << n) - 1;
- cout << maxsuma(free,n) << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement