Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- #include <vector>
- #include <map>
- #include <set>
- #include <ctime>
- #include <cassert>
- #include <queue>
- using namespace std;
- #define f first
- #define s second
- #define mp make_pair
- #define pb push_back
- #define forit(it,con) for (typeof(con.begin()) it = con.begin(); it != con.end(); ++it)
- #define f0(a) memset(a, 0, sizeof(a))
- #define all(v) v.begin(), v.end()
- #define pii pair<int,int>
- #define vi vector<int>
- #define ll long long
- #ifdef WIN32
- #define I64 "%I64d"
- #else
- #define I64 "%lld"
- #endif
- int dp[17][1 << 17];
- int n, a[100][100];
- void Solve() {
- scanf("%d", &n);
- for (int i = 0; i < n; ++i)
- for (int j = 0; j < n; ++j)
- scanf("%d", &a[i][j]);
- for (int i = 0; i <= n; ++i)
- for (int mask = 0; mask < (1 << n); ++mask)
- dp[i][mask] = -(1 << 30);
- dp[0][0] = 0;
- for (int i = 0; i < n; ++i)
- for (int mask = 0; mask < (1 << n); ++mask) if (dp[i][mask] >= 0){
- for (int j = 0; j < n; ++j) if (!(mask & (1 << j)))
- dp[i + 1][mask | (1 << j)] = max(dp[i + 1][mask | (1 << j)], dp[i][mask] + a[i][j]);
- }
- printf("%d\n", dp[n][(1 << n) - 1]);
- }
- int main() {
- #ifdef LOCAL
- freopen("in","r",stdin);
- freopen("out","w",stdout);
- #endif
- int tests;
- scanf("%d", &tests);
- for (int test = 1; test <= tests; ++test) {
- printf("Case %d: ", test);
- Solve();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment