fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define sd(x) scanf("%d", &x);
  4. const int N = 20;
  5. int dp[1 << 20];
  6. int CS[1 << N], w2[N][N], w[N][N];
  7.  
  8. const int INF = 1 << 30;
  9. int main(){
  10. int t; sd(t);
  11. while(t--){
  12. memset(CS, 0, sizeof CS);
  13. memset(dp, 0, sizeof dp);
  14. int n = 20, k = 3;
  15. sd(n); sd(k);
  16. for(int i = 0; i < n; i++)
  17. for(int j = 0; j < n; j++){
  18. w2[i][j] =
  19. (rand() % INF) >> 10;
  20. sd(w2[i][j]);
  21. }
  22. for(int i = 0; i < n; i++)
  23. for(int j = 0; j < n; j++) w[i][j] = w2[n - 1 - i][n - 1 - j];
  24. int extra = n - k;
  25.  
  26. for(int i = 0; i < n; i++)
  27. for(int j = 0; j < i; j++){
  28. int rem = ((1 << n) - 1) ^ (1 << i) ^ (1 << j);
  29. int c = w[i][j];
  30. for(int mask = rem; ; mask = (mask - 1) & rem){
  31. CS[mask ^ (1 << i) ^ (1 << j)] += c;
  32. if(!mask) break;
  33. };
  34. }
  35. int terminalMask = (1 << (n - 1));
  36. for(int i = k - 2; i >= 0; i--){
  37. int maskLeft = 1 << (i + extra);
  38. int maskRight = terminalMask;
  39. terminalMask ^= maskLeft;
  40. int stop = i == 0 ? (1 << extra) - 1 : 0;
  41. for(int mask = (1 << extra) - 1; mask >= stop; mask--){
  42. int wt = CS[mask ^ terminalMask];
  43. int T = INF;
  44. for(int submask = mask; ; submask = (submask - 1) & mask){
  45. int wtLeft = CS[maskLeft ^ submask];
  46. int wtRight = CS[maskRight ^ submask ^ mask];
  47. int cut = wt - wtLeft - wtRight;
  48. T = min(T, cut + dp[mask ^ submask]);
  49. if(!submask) break;
  50. }
  51. dp[mask] = T;
  52. }
  53. }
  54. printf("%d\n", dp[(1 << extra) - 1]);
  55. }
  56. }
Success #stdin #stdout 0s 4392KB
stdin
Standard input is empty
stdout
Standard output is empty