乌龟棋

[Time Gate]

https://www.luogu.org/problem/P1541

【解题思路】

DP

【code】

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 using namespace std;
 5 int i,j,k,l,n,m,a[355],b,f[41][41][41][41],t1,t2,t3,t4,sum;
 6 inline int Max(int a,int b){
 7     return a>b?a:b;
 8 }
 9 int main(){
10     //freopen("1673.in","r",stdin);
11     //freopen("1673.out","w",stdout);
12     scanf("%d%d",&n,&m);
13     for(i=1;i<=n;i++)
14         scanf("%d",&a[i]);
15     for(i=1;i<=m;i++){
16         scanf("%d",&b);
17         if(b==1)t1++;
18         if(b==2)t2++;
19         if(b==3)t3++;
20         if(b==4)t4++;
21     }
22     f[0][0][0][0]=a[1];
23     for(i=0;i<=t1;i++)
24         for(j=0;j<=t2;j++)
25             for(k=0;k<=t3;k++)
26                 for(l=0;l<=t4;l++){
27                     sum=i+j*2+k*3+l*4+1;
28                     if(i>=1)f[i][j][k][l]=Max(f[i-1][j][k][l]+a[sum],f[i][j][k][l]);
29                     if(j>=1)f[i][j][k][l]=Max(f[i][j-1][k][l]+a[sum],f[i][j][k][l]);
30                     if(k>=1)f[i][j][k][l]=Max(f[i][j][k-1][l]+a[sum],f[i][j][k][l]);
31                     if(l>=1)f[i][j][k][l]=Max(f[i][j][k][l-1]+a[sum],f[i][j][k][l]);
32                 } 
33     printf("%d\n",f[t1][t2][t3][t4]);
34     return 0;
35 }

 

posted @ 2019-07-27 23:36  GTR_PaulFrank  阅读(116)  评论(0编辑  收藏  举报