とりあえず解くことはできたが時間がかかりすぎである。
思い込みで進めないでもっと考えるべきである。
class DropCoins { public: int getMinimum(vector <string> board, int K) { int W = board[0].size(); int H = board.size(); //cout<<W<<" "<<H<<endl; VVI v(H); REP(i, H) REP(j, W) v[i].push_back(0); REP(y, H) REP(x, W) { REP(yy, y+1) REP(xx, x+1) { v[y][x] += board[yy][xx]=='o' ? 1:0; } } VI ans; for(int sy=H;sy>0;sy--) { for(int sx=W;sx>0;sx--) { REP(by, H-sy+1) { REP(bx, W-sx+1) { int ax=bx-1; int ay=by-1; int ex=bx+sx-1; int ey=by+sy-1; int co=v[ey][ex]; if(ay>=0) co-=v[ay][ex]; if(ax>=0) co-=v[ey][ax]; if(ax>=0 && ay>=0) co+=v[ay][ax]; //cout<<" try "<<co<<" "<<bx<<" "<<by<<" "<<ex<<" "<<ey<<" area "<<sx<<" "<<sy<<endl; if(co==K) { int lans = 2*(bx+W-ex-1)-max(bx, W-ex-1) + 2*(by + H-ey-1) - max(by, H-ey-1); //cout<<"found "<<lans<<" "<<bx<<" "<<by<<" "<<ex<<" "<<ey<<" area "<<sx<<" "<<sy<<endl; ans.push_back(lans); } } } } } if(ans.size()==0) return -1; sort(ALL(ans)); return ans[0]; }