P1541-乌龟棋

 1 #pragma GCC optimize("Ofast")
 2 #include <bits/stdc++.h>
 3 #define maxn 13003
 4 #define _for(i,a,b) for(int i = (a);i < b;i ++)
 5 typedef long long ll;
 6 using namespace std;
 7 
 8 inline ll read()
 9 {
10     ll ans = 0;
11     char ch = getchar(), last = ' ';
12     while(!isdigit(ch)) last = ch, ch = getchar();
13     while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
14     if(last == '-') ans = -ans;
15     return ans;
16 }
17 inline void write(ll x)
18 {
19     if(x < 0) x = -x, putchar('-');
20     if(x >= 10) write(x / 10);
21     putchar(x % 10 + '0');
22 }
23 
24 int N,M;
25 int ip[400];
26 int dp[41][41][41][41];
27 int num[5];
28 int main()
29 {
30     N = read(),M = read();
31     _for(i,1,N+1)
32         ip[i] = read();
33     
34     _for(i,1,M+1)
35         num[read()] ++;
36     
37     dp[0][0][0][0] = ip[1];
38     _for(a,0,num[1]+1)
39         _for(b,0,num[2]+1)
40             _for(c,0,num[3]+1)
41                 _for(d,0,num[4]+1)
42                 {
43                     int r = 1+a+2*b+3*c+4*d;
44                     if(a) dp[a][b][c][d] = max(dp[a][b][c][d],dp[a-1][b][c][d]+ip[r]);
45                     if(b) dp[a][b][c][d] = max(dp[a][b][c][d],dp[a][b-1][c][d]+ip[r]);
46                     if(c) dp[a][b][c][d] = max(dp[a][b][c][d],dp[a][b][c-1][d]+ip[r]);
47                     if(d) dp[a][b][c][d] = max(dp[a][b][c][d],dp[a][b][c][d-1]+ip[r]);
48                 }
49     write(dp[num[1]][num[2]][num[3]][num[4]]);
50     return 0;
51 }

 

posted @ 2019-08-14 11:03  Asurudo  阅读(182)  评论(0编辑  收藏  举报