Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //TIOJ 1908
- #include <bits/stdc++.h>
- using namespace std;
- int arr[22][22];
- int vis[22];
- map<int, int> dp[22];
- int n;
- int dx[] = {-1,-1,-1,0,0,1,1,1};
- int dy[] = {-1,0,1,-1,1,-1,0,1};
- int dfs(int depth){
- if(depth == n * n)return 0;
- int x = depth / n;
- int y = depth % n;
- if(y == 0 && dp[x].find(vis[x]) != dp[x].end())return dp[x][vis[x]];
- int ret = 0;
- if(!(vis[x] & (1<<y))){
- vector<int> take;
- for(int i = 0 ; i < 8; ++i){
- int nx = x + dx[i], ny = y + dy[i];
- if(0 <= nx && nx < n && 0 <= ny && ny < n && !(vis[nx] & (1<<ny))){
- take.emplace_back(i);
- vis[nx] |= (1<<ny);
- }
- }
- vis[x] |= (1<<y);
- ret = dfs(depth+1) + arr[x][y];
- for(unsigned i = 0; i < take.size(); ++i){
- int nx = x + dx[take[i]], ny = y + dy[take[i]];
- vis[nx] &= ~(1<<ny);
- }
- vis[x] &= ~(1<<y);
- }
- if(x < 2 || y < 2 || (vis[x-2]&(1<<(y-2))))ret = max(ret, dfs(depth+1));
- if(y == 0)dp[x][vis[x]] = ret;
- return ret;
- }
- int32_t main(){
- cin >> n;
- for(int i = 0; i < n; ++i){
- for(int j = 0; j < n; ++j){
- cin >> arr[i][j];
- }
- }
- cout << dfs(0) << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement