fork download
  1. #include <bits/stdc++.h>
  2.  
  3.  
  4.  
  5. using namespace std;
  6.  
  7. int cp[14][14][14]; //[D残数][H残数][S残数]=完成済み数字pair数
  8. int np[14][14][14]; //クラブ残数は計算で出す
  9. int cv[130];
  10. const vector<int> ppr={3,5,9,6,10,12};//{1,2,4,8} NCR(4,2)の和
  11.  
  12.  
  13. int fnc(const string s){
  14. int n=s.size() /2 ;
  15. int sct[4] ={}; //スート計
  16. vector<int> hns(14, 0);
  17. for(int i=0;i<n;i++){
  18. int crk = cv[s[2*i+1]];
  19. //assert(crk>=0 && crk<13);
  20. hns[crk] |= 1<< cv[s[2*i]]; //bitで管理
  21. sct[cv[s[2*i]]]++;
  22. }
  23. //for(auto x : hns) printf("%d, ",x); puts("");
  24. memset(cp, -1, sizeof cp);
  25. cp[sct[0]][sct[1]][sct[2]] = 0;
  26.  
  27. for(auto hi: hns){
  28. memset(np, -1, sizeof np);
  29. for(int d=0;d<14;d++) for(int h=0;h<14;h++) for(int s=0;s<14;s++){
  30. const int& cr = cp[d][h][s];
  31. if(cr < 0 ) continue;
  32. if(hi == 15){ //2pair処理
  33. assert(d>=1 && h>=1 && s>=1);
  34. np[d-1][h-1][s-1] = max(np[d-1][h-1][s-1], cr+2);
  35. }
  36. for(auto z: ppr){ //1pairを6通り
  37. if((hi & z) == z){
  38. bitset<6> v(z); // v[n] = z>>n &1
  39. np[d -v[0]][h -v[1]][s -v[2]] =
  40. max(np[d -v[0]][h -v[1]][s -v[2]], cr +1);
  41. }
  42. }
  43. np[d][h][s] = max(np[d][h][s], cr); //no pairか回避
  44. }
  45. swap(cp, np);
  46. }
  47.  
  48. int ans =0;
  49. for(int d=0;d<14;d++) for(int h=0;h<14;h++) for(int s=0;s<14;s++) {
  50. const int& cr = cp[d][h][s];
  51. if(cr < 0 ) continue;
  52. int cct = n - 2*cr -d - h- s; //Cクラブの残数計算
  53. int sm = cr + d/2 + h/2 + s/2 + cct/2;
  54. ans = max(ans, sm);
  55. }
  56. return ans;
  57. }
  58.  
  59. int main()
  60. {
  61.  
  62.  
  63. memset(cv, -1, sizeof cv); //
  64. string rs1="A23456789TJQK", rs2="DHSC";
  65. for(int i=0;i<13;i++) cv[rs1[i]] = i;
  66. for(int i=0;i<4 ;i++) cv[rs2[i]] = i;
  67. //vector<int> cpr={3,5,9,6,10,12};
  68. //for(int i=0;i<16;i++) if(__builtin_popcount(i) ==2) cpr.push_back(i);
  69.  
  70. string s;
  71. while( cin >> s ){
  72. cout << s <<" --> " << fnc(s) << endl;
  73. }
  74. return 0;
  75. }
  76. /*
  77. "DAD2HAH3" -> 2
  78. "DAD3D8D9DJH5H8HKSASKCAC5C8CK" -> 7
  79. "SAS2S3S4S5S6S7S8S9C2C3C4C5C6C7C8C9CT" -> 9
  80. */
  81.  
Success #stdin #stdout 0s 16088KB
stdin
DAD2HAH3
DAD3D8D9DJH5H8HKSASKCAC5C8CK
SAS2S3S4S5S6S7S8S9C2C3C4C5C6C7C8C9CT
D2H2S2C2DK
HAH2H3H4H5H6H7H8H9HTHJHQHKCAC2C3C4C5C6C7C8C9CTCJCQCK
HAH2C2CAS7SAD8DA
stdout
DAD2HAH3 --> 2
DAD3D8D9DJH5H8HKSASKCAC5C8CK --> 7
SAS2S3S4S5S6S7S8S9C2C3C4C5C6C7C8C9CT --> 9
D2H2S2C2DK --> 2
HAH2H3H4H5H6H7H8H9HTHJHQHKCAC2C3C4C5C6C7C8C9CTCJCQCK --> 13
HAH2C2CAS7SAD8DA --> 4