ahmrf

wa

Oct 5th, 2015
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long   LL;
  6. #define pii         pair<int,int>
  7. #define pll         pair<LL,LL>
  8. #define vi      vector<int>
  9. #define SYNC        ios_base::sync_with_stdio(0)
  10. #define CT      cin.tie(0)
  11. #define sf(a)       scanf("%d", &a)
  12. #define sll(a)      scanf("%lld", &a)
  13. #define sff(a, b)   scanf("%d %d", &a, &b)
  14. #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
  15. #define debug       printf("Here\n")
  16. #define PI      acos(-1)
  17. #define all(x)      x.begin(),x.end()
  18. #define mem(x, val)     memset((x),val,sizeof((x)))
  19. #define xx      first
  20. #define yy      second
  21. #define pb      push_back
  22. #define _max(a,b,c)     max(a, max(b, c))
  23. #define _min(a,b,c)     min(a, min(b, c))
  24. #define INF         INT_MAX
  25. #define MOD         1000000007
  26. #define NN      100005
  27.  
  28. int setBit(int n, int pos) { return n = n | (1 << pos); }
  29. int resetBit(int n, int pos) { return n = n & ~(1 << pos); }
  30. bool checkBit(int n, int pos) { return (bool)(n & (1 << pos)); }
  31.  
  32. int s[80][80];
  33. bool vis[80][80];
  34. LL dp[80][80][10][5];
  35. int n, k;
  36. LL maxx;
  37.  
  38. bool valid(int x, int y) {
  39.     return (x > 0 && y > 0 && x <= n && y <= n);   
  40. }
  41.  
  42. int dx[] = {1,0, 0};
  43. int dy[] = {0,-1,1};
  44.  
  45. void dfs(int x, int y, int cnt, LL sum) {
  46.     if(cnt > k) return;
  47.     if(x == n && y == n) {
  48.         maxx = max(sum, maxx);
  49.         return;
  50.     }
  51.     for(int i = 0; i < 3; i++) {
  52.         int xx = x + dx[i], yy = y + dy[i];
  53.         if(valid(xx, yy) && !vis[xx][yy]) {
  54.             vis[xx][yy] = true;
  55.             if(s[xx][yy] < 0 && dp[xx][yy][cnt + 1][i] < sum + s[xx][yy]) {
  56.                 dp[xx][yy][cnt + 1][i] = sum + s[xx][yy];
  57.                 dfs(xx, yy, cnt + 1, sum + s[xx][yy]);
  58.             } else if(s[xx][yy] >= 0 && dp[xx][yy][cnt][i] < sum + s[xx][yy]) {
  59.                 dp[xx][yy][cnt][i] = sum + s[xx][yy];
  60.                 dfs(xx, yy, cnt, sum + s[xx][yy]);
  61.             }
  62.             vis[xx][yy] = false;
  63.         }
  64.     }
  65. }
  66.  
  67. int main() {
  68.     int cs = 1;
  69.     while(sff(n, k) == 2 && n)) {
  70.         for(int i = 1; i <= n; i++) {
  71.             for(int j = 1; j <= n; j++) {
  72.                 sf(s[i][j]);
  73.             }
  74.         }
  75.         maxx = -INF;
  76.         mem(vis, false);
  77.         for(int i = 1; i <= n; i++)
  78.             for(int j = 1; j <= n; j++)
  79.                 for(int k = 0; k < 6; k++)
  80.                     for(int d = 0; d < 3; d++)
  81.                         dp[i][j][k][d] = -INF;
  82.         vis[1][1] = true;
  83.         dfs(1, 1, s[1][1] < 0, s[1][1]);
  84.         printf("Case %d: ", cs++);
  85.         maxx == -INF? puts("impossible") : printf("%lld\n", maxx);
  86.  
  87.     }
  88.     return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment