SRM370 div1medium
通信範囲を1づつ大きくしながらメモ化再帰。
#include <algorithm> #include <vector> using namespace std; class ConnectTheCities { public: int n,dist,range; vector<int> pos; int cache[105][55]; int rec(int bP,int k) { //printf("bP=%d k=%d\n",bP,k); int &r=cache[bP][k]; if(r!=-1) ; else if(k==n) { if(dist-range<=bP) r=0; else r=1000000; } else { r=1000000; for(int nP=bP;nP<=min(bP+range,dist);nP++) r=min(r,abs(nP-pos[k])+rec(nP,k+1)); } return r; } int minimalRange(int distance, int funds, vector <int> position) { dist=distance; pos=position; sort(pos.begin(),pos.end()); n=pos.size(); pos.push_back(distance); //printf("n=%d\n",n); for(range=1;range<=distance;range++) { memset(cache,-1,sizeof(cache)); if(rec(0,0)<=funds) return range; } } };