SRM 632 div 1
今回もeasyだけ解いてsystest通った.
解法を思いつくのが遅すぎ
1294 -> 1335
解法は適当な長さだけ答えを埋め込んで各[i,j]に対して一致するかをひたすらチェックするだけ
#include <cstdio> #include <algorithm> #include <vector> using namespace std; int b[] = {0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0}; class PotentialArithmeticSequence{ public: vector<int> D; bool ch(int i, int j){ int ma = 0; int p = -1; for(int k = i; k <= j; k++){ if(D[k] > ma){ p = k; ma = D[k]; } } if(ma >= 5){ int idx = 0; for(int k = p+1; k <= j; k++){ if(D[k]!=b[idx]) return false; idx++; } idx = 0; for(int k = p-1; k >= i; k--){ if(D[k]!=b[idx]) return false; idx++; } }else{ int k; for(k = 0; k < 50; k++){ if(b[k] == ma){ break; } } int idx = 1; for(int t = p+1; t <= j; t++){ if(D[t] != b[k+idx]) return false; idx++; } idx = 1; for(int t = p-1; t >= i; t--){ if(D[t] != b[k+idx]) return false; idx++; } } return true; } int numberOfSubsequences(vector <int> d){ int n = d.size(); int ans = n; D = d; for(int i = 0; i < n; i++){ for(int j = i+1; j < n; j++){ if(ch(i,j)) ans++; } } return ans; } };