//dp 以十个十个为单位,f[i][j]表示到第i个城市,用的牌的组合为j,j用1~15表示,二进制的四位表示四张牌,然后线性dp即可 #include <iostream> #include <vector> #include "bits/stdc++.h" using namespace std; using ll = long long; const int maxn = 1e5+10; ll f[maxn][16]; int main() { int n; scanf("%d",&n); vector<ll>A(n+1,0); for(int i =1;i<=n;i++){ scanf("%lld",&A[i]); } memset(f,-1,sizeof(f)); f[0][0] = 0; for(int i = 1;i<=n;i++){ for(int j = 1;j<16;j++){ int cur = 1; int d =0; while(cur<=4){ if(j&(1<<(cur-1))){ d+=cur; } cur++; } // if(i==4){ // printf("j:%d d:%d\n",j,d); // } int turn_dis = i%10; if(turn_dis == 0) turn_dis = 10; if(d!=turn_dis) continue; // if(d>turn_dis) break; // printf("turndis:%d\n",turn_dis); cur = 1; while(cur<=4){ if(j&(1<<(cur-1))){ int pre = j^(1<<(cur-1)); // printf("i:%d j:%d cur:%d pre:%d\n",i,j,cur,pre); // printf("f[i-cur][pre]:%lld\n",f[i-cur][pre]); if(f[i-cur][pre]!=-1&&f[i-cur][pre]+A[i]>=0) f[i][j] = max(f[i-cur][pre]+A[i],f[i][j]); // printf("%d\n") } cur++; } // printf("i:%d j:%d,f[i][j]:%lld\n",i,j,f[i][j]); } if(i%10==0){ f[i][0] = f[i][15]; } } ll ans = -1; for(int i = 0;i<=15;i++) ans = max(ans,f[n][i]); printf("%lld\n",ans); // printf("%lld\n",f[n][]) } // 64 位输出请用 printf("%lld")