Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long LL;
- #define pii pair<int,int>
- #define pll pair<LL,LL>
- #define vi vector<int>
- #define SYNC ios_base::sync_with_stdio(0)
- #define CT cin.tie(0)
- #define sf(a) scanf("%d", &a)
- #define sll(a) scanf("%lld", &a)
- #define sff(a, b) scanf("%d %d", &a, &b)
- #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
- #define debug printf("Here\n")
- #define PI acos(-1)
- #define all(x) x.begin(),x.end()
- #define mem(x, val) memset((x),val,sizeof((x)))
- #define xx first
- #define yy second
- #define pb push_back
- #define _max(a,b,c) max(a, max(b, c))
- #define _min(a,b,c) min(a, min(b, c))
- #define INF INT_MAX
- #define MOD 1000000007
- #define NN 100005
- int setBit(int n, int pos) { return n = n | (1 << pos); }
- int resetBit(int n, int pos) { return n = n & ~(1 << pos); }
- bool checkBit(int n, int pos) { return (bool)(n & (1 << pos)); }
- int s[80][80];
- bool vis[80][80];
- LL dp[80][80][10][5];
- int n, k;
- LL maxx;
- bool valid(int x, int y) {
- return (x > 0 && y > 0 && x <= n && y <= n);
- }
- int dx[] = {1,0, 0};
- int dy[] = {0,-1,1};
- void dfs(int x, int y, int cnt, LL sum) {
- if(cnt > k) return;
- if(x == n && y == n) {
- maxx = max(sum, maxx);
- return;
- }
- for(int i = 0; i < 3; i++) {
- int xx = x + dx[i], yy = y + dy[i];
- if(valid(xx, yy) && !vis[xx][yy]) {
- vis[xx][yy] = true;
- if(s[xx][yy] < 0 && dp[xx][yy][cnt + 1][i] < sum + s[xx][yy]) {
- dp[xx][yy][cnt + 1][i] = sum + s[xx][yy];
- dfs(xx, yy, cnt + 1, sum + s[xx][yy]);
- } else if(s[xx][yy] >= 0 && dp[xx][yy][cnt][i] < sum + s[xx][yy]) {
- dp[xx][yy][cnt][i] = sum + s[xx][yy];
- dfs(xx, yy, cnt, sum + s[xx][yy]);
- }
- vis[xx][yy] = false;
- }
- }
- }
- int main() {
- int cs = 1;
- while(sff(n, k) == 2 && n)) {
- for(int i = 1; i <= n; i++) {
- for(int j = 1; j <= n; j++) {
- sf(s[i][j]);
- }
- }
- maxx = -INF;
- mem(vis, false);
- for(int i = 1; i <= n; i++)
- for(int j = 1; j <= n; j++)
- for(int k = 0; k < 6; k++)
- for(int d = 0; d < 3; d++)
- dp[i][j][k][d] = -INF;
- vis[1][1] = true;
- dfs(1, 1, s[1][1] < 0, s[1][1]);
- printf("Case %d: ", cs++);
- maxx == -INF? puts("impossible") : printf("%lld\n", maxx);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment