Submission #70008973


Source Code Expand

Copy
#include <stdio.h>
int N;
int next[16];
int A[16][16];
int memo[1 << 16];
int calc(int status) {
int num = 0;
int next_candidate = 0;
int ans = 0;
int i;
/* Ncalc */
if (memo[status]) return ~memo[status];
for (i = 0; i < N; i++) {
if ((status >> i) & 1) {
num++;
next_candidate |= next[i];
}
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include <stdio.h>

int N;
int next[16];
int A[16][16];

int memo[1 << 16];

int calc(int status) {
	int num = 0;
	int next_candidate = 0;
	int ans = 0;
	int i;
	/* N部屋埋まっている場合、下のループでcalcを呼び出さないので、チェックなしでおk */
	if (memo[status]) return ~memo[status];
	for (i = 0; i < N; i++) {
		if ((status >> i) & 1) {
			num++;
			next_candidate |= next[i];
		}
	}
	next_candidate &= ~status;
	for (i = 0; i < N; i++) {
		if ((next_candidate >> i) & 1) {
			int candidate = calc(status | (1 << i)) + A[num][i];
			if (candidate > ans) ans = candidate;
		}
	}
	return ~(memo[status] = ~ans);
}

int main(void) {
	int M;
	int i, j;
	if (scanf("%d%d", &N, &M) != 2) return 1;
	for (i = 0; i < M; i++) {
		int U, V;
		if (scanf("%d%d", &U, &V) != 2) return 1;
		next[U - 1] |= 1 << (V - 1);
		next[V - 1] |= 1 << (U - 1);
	}
	for (i = 1; i < N; i++) {
		for (j = 0; j < N; j++) {
			if (scanf("%d", &A[i][j]) != 1) return 1;
		}
	}
	printf("%d\n", calc(1));
	return 0;
}

Submission Info

Submission Time
Task G - 進撃のパ研
User mikecat
Language C (gcc 12.2.0)
Score 400
Code Size 1075 Byte
Status AC
Exec Time 2 ms
Memory 1872 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 400 / 400
Status
AC × 2
AC × 20
Set Name Test Cases
Sample example0.txt, example1.txt
All corner0.txt, example0.txt, example1.txt, maximum0.txt, maximum1.txt, maximum2.txt, maximum3.txt, maximum4.txt, maximum5.txt, maximum6.txt, maximum7.txt, minimum0.txt, random0.txt, random1.txt, random2.txt, random3.txt, random4.txt, random5.txt, random6.txt, random7.txt
Case Name Status Exec Time Memory
corner0.txt AC 1 ms 1736 KiB
example0.txt AC 1 ms 1576 KiB
example1.txt AC 1 ms 1632 KiB
maximum0.txt AC 2 ms 1720 KiB
maximum1.txt AC 2 ms 1852 KiB
maximum2.txt AC 2 ms 1840 KiB
maximum3.txt AC 2 ms 1752 KiB
maximum4.txt AC 2 ms 1856 KiB
maximum5.txt AC 2 ms 1720 KiB
maximum6.txt AC 2 ms 1724 KiB
maximum7.txt AC 2 ms 1872 KiB
minimum0.txt AC 1 ms 1732 KiB
random0.txt AC 1 ms 1744 KiB
random1.txt AC 1 ms 1664 KiB
random2.txt AC 1 ms 1576 KiB
random3.txt AC 1 ms 1612 KiB
random4.txt AC 1 ms 1684 KiB
random5.txt AC 1 ms 1624 KiB
random6.txt AC 1 ms 1708 KiB
random7.txt AC 1 ms 1636 KiB


2025-10-11 (Sat)
03:17:33 +09:00