ã¨ããå¶ç´ãããã«ãæªããï¼
åé¡æ¦è¦
1 ä»¥ä¸ 20 以ä¸ã®æ´æ°ãããªããé·ã ã®æ°å
ãä¸ããããã
ãã®æ°åã®é¨åå (é£ç¶ã§ãªãã¦ãã) ã§ãã£ã¦ãä»»æã®æ´æ°ã«ã¤ãã¦ããã®é¨ååã«å«ã¾ããåæ°ã 0 åã¾ã㯠2 åã§ãããã®ãèããã
ãã®ãããªé¨ååã«å«ã¾ããè¦ç´ ã®åæ°ã®æ大å¤ãæ±ããã
å¶ç´
èãããã¨
ãé¨ååãã¨ããã®ã§ãæåã¯é¨åå DP ãããã®ãã¨èãããããè¯ãæãã®è¨ç®éã«ãªãæ¹æ³ã¯æµ®ãã°ãªãã£ããã¨ããã®ããé¨åå DP ãæ´æ°ããéã«ãã©ã®å¤ã¯æ¢ã«ä½¿ã£ãã®ããã管çãããã®ã ãbit DP ãã§ãããªãããããã
ããã§ã代ããã«æ¬¡ã® DP ãèãããã¨ã«ããã
dp[S]
ï¼ããããæ´æ°å¤éå
ã«å«ã¾ããæ´æ°ãã¡ããã© 2 åãã¤å«ã¾ããããããªé¨ååãã¨ãããããª
ã®æå°å¤ï¼ã¨ããªãå ´åã¯
ï¼
ãã® DP ãæ´æ°ããããã«ã以ä¸ã®ãã¼ã¿ããããããç¨æãã¦ãããããã¯ã ã¨ãã¦ã
ã®è¨ç®éã§æ±ããããã
nex[i][c]
ï¼ã¨ãªããããª
(
) ã®æå°å¤
ã¾ããDP ã®æ´æ°ã«è¦ããè¨ç®é㯠ã¨ãªãã以ä¸ãã¾ã¨ãã¦ãè¨ç®éã¯
ã¨è©ä¾¡ã§ããã
ã³ã¼ã
#include <bits/stdc++.h> using namespace std; int main() { const int MAX = 20; int N; cin >> N; vector<int> A(N); for (int i = 0; i < N; i++) cin >> A[i], A[i]--; // nexind[i][c] := åæå c ã«ã¤ã㦠A[j] = c ãªã j (>= i) ã®æå°å¤ vector nexind(N+1, vector(MAX, N)); for (int i = N-1; i >= 0; i--) { for (int j = 0; j < MAX; j++) { nexind[i][j] = nexind[i+1][j]; } nexind[i][A[i]] = i; } // bitDP int res = 0; const int INF = 1 << 29; vector<int> dp(1 << MAX, INF); dp[0] = 0; for (int bit = 0; bit < (1 << MAX); bit++) { if (dp[bit] == INF) continue; res = max(res, __builtin_popcount(bit) * 2); for (int v = 0; v < MAX; v++) { if (bit & (1 << v)) continue; int bit2 = bit | (1 << v); int nex = nexind[dp[bit]][v]; if (nex >= N) continue; nex = nexind[nex+1][v]; if (nex >= N) continue; dp[bit2] = min(dp[bit2], nex+1); } } cout << res << endl; }