SRM304 div2 hard
幾何+DP。
問題文見て「あ、幾何や。やめとこ。」と思い、すぐに解説を探したけど幾何の部分も大したことはなかった。
DPも大したことはないけど、1点だけ注意が必要。
それは頂点[0]と頂点[n-1]は隣り合っているので同時に使ってはいけないという点。
参考にさせていただいたページ:
SRM 304 PolyMove - hama_DU@TopCoderへの道 - TopCoder部
#include <cmath> #include <vector> using namespace std; class PolyMove { public: double getInc(double x1,double y1,double x2,double y2) { double xd=x1-x2,yd=y1-y2; return sqrt(xd*xd+yd*yd)/2.0; } double addedArea(vector <int> _x, vector <int> _y) { int n=_x.size(); vector<double> x(n),y(n),inc(n); for(int i=0;i<n;i++) x[i]=_x[i],y[i]=_y[i]; for(int i=1;i<n-1;i++) inc[i]=getInc(x[(i-1+n)%n],y[(i-1+n)%n],x[(i+1+n)%n],y[(i+1+n)%n]); double ans; double DP[55]; //inc[n-1]を使う場合 DP[n]=0.0; //これは番兵的存在 DP[n-1]=inc[n-1]; for(int i=n-2;1<=i;i--) DP[i]=max(DP[i+2]+inc[i],DP[i+1]); //inc[i]を使うならinc[i+1]は使えない ans=DP[1]; //inc[0]を使う場合 DP[n]=0.0; DP[n-1]=0.0; for(int i=n-2;0<=i;i--) DP[i]=max(DP[i+2]+inc[i],DP[i+1]); ans=max(ans,DP[0]); return ans; } };