TCO11 Qual2 Medium(500) KindAndCruel
動的計画法。それぞれの位置に到達可能かどうかを覚えておく。同じ位置にK*C秒後に居ても意味は無いので、K*Cで少なくとも1マスは進むはず。K*C*n秒後にも右端に到達できなければ到達不可。
#include <string> #include <vector> using namespace std; class KindAndCruel{public: int crossTheField( string field, int K, int C ) { int n = (int)field.size(); vector<bool> T( n, false ); T[0] = true; for ( int t=1; t<=K*C*n; t++ ) { vector<bool> P = T; T.clear(); for ( int i=0; i<n; i++ ) T.push_back( ( field[i]!='K' || t%K!=0 ) && ( field[i]!='C' || t%C==0 ) && ( 0<i && P[i-1] || P[i] || i<n-1 && P[i+1] ) ); if ( T[n-1] ) return t; } return -1; }};