TrickmanOff

Jumanji 16/17 D

Jan 9th, 2020
395
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.15 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <fstream>
  4. #include <vector>
  5. #include <queue>
  6. #include <functional>
  7. #include <set>
  8. #include <map>
  9. #include <math.h>
  10. #include <cmath>
  11. #include <string>
  12. #include <time.h>
  13. #include <random>
  14. #include <unordered_set>
  15. #include <unordered_map>
  16. #include <bitset>
  17. #include <string.h>
  18. #include <stack>
  19. using namespace std;
  20. //
  21. #define fast cin.tie(0);cout.tie(0);cin.sync_with_stdio(0);cout.sync_with_stdio(0);
  22. #define cin in
  23. #define cout out
  24. #define ll long long
  25. #define db double
  26. #define ld long double
  27. #define uset unordered_set
  28. #define umap unordered_map
  29. #define F first
  30. #define S second
  31. #define vec vector
  32. #define ms multiset
  33. #define pb push_back
  34. #define pdd pair<ld, ld>
  35. #define pq priority_queue
  36. #define umap unordered_map
  37. #define uset unordered_set
  38. #define pii pair<int, int>
  39. #define pll pair<ll, ll>
  40. #define pnn pair<Node*, Node*>
  41. #define uid uniform_int_distribution
  42. #define ull unsigned long long
  43.  
  44. ifstream in("input.txt");
  45. ofstream out("output.txt");
  46.  
  47. const ll INF = 1e18;
  48. const int MAX_N = 1000;
  49. int sz[MAX_N], c[MAX_N];
  50. vector<int> g[MAX_N];
  51. int n, k;
  52. ll dp[MAX_N][MAX_N + 1][2];
  53.  
  54. void dfs(int v, int p) {
  55.     sz[v] = 1;
  56.  
  57.     vector<vector<ll>> cdp0(1, vector<ll>(2 * k + 1, -INF));//not in path
  58.     vector<vector<ll>> cdp1(1, vector<ll>(2 * k + 1, -INF));//end of path
  59.     vector<vector<ll>> cdp2(1, vector<ll>(2 * k + 1, -INF));//not end of path
  60.     cdp0[0][0] = 0;
  61.     int p = 0;
  62.  
  63.     for (int to : g[v]) {
  64.         if (to == p) continue;
  65.  
  66.         dfs(to, v);
  67.         p++;
  68.  
  69.         cdp0.push_back(vector<ll>(2 * k + 1, -INF));
  70.         cdp1.push_back(vector<ll>(2 * k + 1, -INF));
  71.         cdp2.push_back(vector<ll>(2 * k + 1, -INF));
  72.  
  73.         for (int i = 0; i <= k && i <= sz[v]; i++) {
  74.             for (int j = 0; j <= k && j <= sz[to]; j++) {
  75.  
  76.                 //0 + 0
  77.                 if(i + j <= k && cdp0[p-1][i] != -INF && dp[to][j][0] != -INF)
  78.                     cdp0[p][i + j] = max(cdp0[p][i + j], cdp0[p - 1][i] + dp[to][j][0]);
  79.  
  80.                 //0 + 1, don't add u
  81.                 if (i + j <= k && cdp0[p-1][i] != -INF && dp[to][j][1] != -INF)
  82.                     cdp0[p][i + j] = max(cdp0[p][i + j], cdp0[p - 1][i] + dp[to][j][1]);
  83.  
  84.                 //0 + 1, add u
  85.                 if(i + j <= k && cdp0[p-1][i] != -INF && dp[to][j][1] != -INF)
  86.                     cdp1[p][i + j] = max(cdp1[p][i + j], cdp0[p - 1][i] + dp[to][j][1] + c[v]);
  87.                
  88.                 //1 + 0
  89.                 if(i + j <= k && cdp1[p - 1][i] != -INF && dp[to][j][0] != -INF)
  90.                     cdp1[p][i + j] = max(cdp1[p][i + j], cdp1[p - 1][i] + dp[to][j][0]);
  91.  
  92.                 //1 + 1, don't merge
  93.                 if(i + j <= k && cdp1[p - 1][i] != -INF && dp[to][j][1] != -INF)
  94.                     cdp1[p][i + j] = max(cdp1[p][i + j], cdp1[p - 1][i] + dp[to][j][1]);
  95.  
  96.                 //1 + 1, merge
  97.                 if(i + j - 1 <= k && i + j - 1 >= 0 && cdp1[p - 1][i] != -INF && dp[to][j][1] != -INF)
  98.                     cdp2[p][i + j - 1] = max(cdp2[p][i + j - 1], cdp1[p - 1][i] + dp[to][j][1]);
  99.  
  100.                 //2 + 0
  101.                 if(i + j <= k && cdp2[p - 1][i] != -INF && dp[to][j][0] != -INF)
  102.                     cdp2[p][i + j] = max(cdp2[p][i + j], cdp2[p - 1][i] + dp[to][j][0]);
  103.  
  104.                 //2 + 1
  105.                 if(i + j <= k && cdp2[p - 1][i] != -INF && dp[to][j][1] != -INF)
  106.                     cdp2[p][i + j] = max(cdp2[p][i + j], cdp2[p - 1][i] + dp[to][j][1]);
  107.             }
  108.         }
  109.  
  110.         sz[v] += sz[to];
  111.  
  112.     }
  113. }
  114.  
  115. int main() {
  116.     fast;
  117.    
  118.  
  119. }
Advertisement
Add Comment
Please, Sign In to add comment