1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #include<algorithm> #include<cstring> #include<cstdio>
using namespace std;
typedef long long LL;
const int N = 200005;
int n, k; LL dp[N][20], ans; struct Card{ int cost; LL dam; bool operator < (const Card &A) const{ return cost == A.cost ? dam > A.dam : cost < A.cost; } }c[N][10], t[N];
inline int MOD(int x){ return (x % 10 + 10) % 10; }
int main(){ scanf("%d", &n); memset(dp, -0x7f, sizeof dp); dp[0][0] = 0; for(int i = 1; i <= n; i++){ scanf("%d", &k); for(int j = 1; j <= k; j++) { scanf("%d%lld", &t[j].cost, &t[j].dam); } sort(t+1, t+k+1); int cnt1 = 0, cnt2 = 0, cnt3 = 0; for(int j = 1; j <= k; j++){ if(t[j].cost == 1 && cnt1 < 3) c[i][++cnt1] = t[j]; else if(t[j].cost == 2 && !cnt2) cnt2++, c[i][4] = t[j]; else if(t[j].cost == 3 && !cnt3) cnt3++, c[i][5] = t[j]; } for(int j = 0; j < 10; j++){ dp[i][j] = dp[i-1][j]; if(c[i][5].cost == 3) dp[i][j] = max(dp[i][j], dp[i-1][MOD(j-1)] + c[i][5].dam + (j == 0 ? c[i][5].dam : 0)); if(c[i][4].cost == 2) dp[i][j] = max(dp[i][j], dp[i-1][MOD(j-1)] + c[i][4].dam + (j == 0 ? c[i][4].dam : 0)); if(c[i][4].cost == 2 && c[i][1].cost == 1) dp[i][j] = max(dp[i][j], dp[i-1][MOD(j-2)] + c[i][4].dam + c[i][1].dam + (j < 2 ? max(c[i][1].dam, c[i][4].dam) : 0)); if(c[i][1].cost == 1) dp[i][j] = max(dp[i][j], dp[i-1][MOD(j-1)] + c[i][1].dam + (j == 0 ? c[i][1].dam : 0)); if(c[i][2].cost == 1) dp[i][j] = max(dp[i][j], dp[i-1][MOD(j-2)] + c[i][1].dam + c[i][2].dam + (j < 2 ? c[i][1].dam : 0)); if(c[i][3].cost == 1) dp[i][j] = max(dp[i][j], dp[i-1][MOD(j-3)] + c[i][1].dam + c[i][2].dam + c[i][3].dam + (j < 3 ? c[i][1].dam : 0)); } } for(int j = 0; j < 10; j++) ans = max(ans, dp[n][j]); printf("%lld\n", ans); return 0; }
|