乌龟棋(机智DP
[luogu P1541]
一开始想开一维数组但是记录不了用的卡片我是sbb
后来想开五维数组但是空间不够
发现只要开四维就好了,代表1、2、3、4卡片用的个数。想到这个以后就很好做了
dp[i][j][k][g]的上一个状态可以是四种卡片转移来的
记得距离加1,起始点是1不是0
加的a的位置是ijkg的不是上一个状态的大憨罗
int n,m;
int dp[maxn][maxn][maxn][maxn],a[maxn1],b[5];
int cmp(int i,int j,int k,int g){
return dp[i][j][k][g];
}
int main(){
n=ird();m=ird();
for(int i=1;i<=n;i++){
a[i]=ird();
}
for(int i=1;i<=m;i++){
int t=ird();
b[t]++;
}
int ans=0;
dp[0][0][0][0]=a[1];
for(int i=0;i<=b[1];i++){
for(int j=0;j<=b[2];j++){
for(int k=0;k<=b[3];k++){
for(int g=0;g<=b[4];g++){
if(i) dp[i][j][k][g]=max(dp[i][j][k][g],cmp(i-1,j,k,g)+a[i+j*2+k*3+4*g+1]);
if(j) dp[i][j][k][g]=max(dp[i][j][k][g],cmp(i,j-1,k,g)+a[i+j*2+k*3+4*g+1]);
if(k) dp[i][j][k][g]=max(dp[i][j][k][g],cmp(i,j,k-1,g)+a[i+j*2+k*3+4*g+1]);
if(g) dp[i][j][k][g]=max(dp[i][j][k][g],cmp(i,j,k,g-1)+a[i+j*2+k*3+4*g+1]);
if(i+j*2+3*k+4*g+1==n)
ans=max(ans,dp[i][j][k][g]);
}
}
}
}
cout<<ans<<endl;
return 0;
}