乌龟棋
[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 }