本番で解けなかった600問題を解いた。
#line 5 "DengklekMakingChains.cpp" #include <string> #include <vector> #include <sstream> #include <iostream> #include <algorithm> using namespace std; class DengklekMakingChains { public: int maxBeauty(vector <string> chains) { int full_max = 0,single_max = 0,side_max = 0; vector<string> side; bool flag = true; for (int i=0; i < chains.size(); i++) { if (chains[i][0] != '.' && chains[i][1] != '.' && chains[i][2] != '.') { int max = (int)(chains[i][0] - '0') + (int)(chains[i][1] - '0') + (int)(chains[i][2] - '0'); full_max += max; }else if (chains[i][0] == '.' && chains[i][1] != '.' && chains[i][2] == '.') { int single = (int)(chains[i][1] - '0'); if(single_max < single) { single_max = single; } }else if (chains[i][0] != '.' || chains[i][2] != '.') { side.push_back(chains[i]); flag = false; } } if (flag) { return max(single_max,(side_max + full_max)); } if(side.size() == 1) { vector<int> num; num.push_back(0); int count = 0; for (int n=0; n < side[0].size(); n++) { if (side[0][n] != '.') { num[count] += (int)(side[0][n] - '0'); }else { count++; num.push_back(0); } } vector<int>::iterator it = max_element( num.begin(), num.end() ); if (side_max < *it) { side_max = *it; } return max(single_max,(side_max + full_max)); } for (int i=0; i < side.size() - 1; i++) { for (int j=i+1; j < side.size(); j++) { for (int k=0; k < 2; k++) { string join = ""; if (k == 0) { join = side[i] + side[j]; }else { join = side[j] + side[i]; } vector<int> num; num.push_back(0); int count = 0; for (int n=0; n < join.size(); n++) { if (join[n] != '.') { num[count] += (int)(join[n] - '0'); }else { count++; num.push_back(0); } } vector<int>::iterator it = max_element( num.begin(), num.end() ); if (side_max < *it) { side_max = *it; } } } } return max(single_max,(side_max + full_max)); } };