分配宝石求助

#include <bits/stdc++.h>
#define int long long
using namespace std;
int dp[100005][3][3][3][3];// i,j,k,x,y,j是X前两个选的,k是X上一个选的,x,y分别是W前两个和上一个选的
int a[100005];
signed main(){
  int n;
  cin>>n;
  for(int i=1;i<=n;i++){
    cin>>a[i];
    for(int j=0;j<3;j++){
      for(int k=0;k<3;k++){
        for(int x=0;x<3;x++){
          for(int y=0;y<3;y++){
            dp[i][j][k][x][y]=-1;
          }
        }
      }
    }
  }
  dp[1][0][0][0][0]=0;
  for(int i=1;i<=n;i++){
    for(int j=0;j<3;j++){
      for(int k=0;k<3;k++){
        for(int x=0;x<3;x++){
          for(int y=0;y<3;y++){
            dp[i][j][k][x][y]=max({dp[i-1][j][k][x][y]+a[i],dp[i][k][a[i]][x][y],dp[i][j][k][y][a[i]]});
          }
        }
      }
    }
  }
  int maxn=-1;
  for(int j=0;j<3;j++){
    for(int k=0;k<3;k++){
      for(int x=0;x<3;x++){
        for(int y=0;y<3;y++){
          maxn=max(dp[n][j][k][x][y],maxn);
        }
      }
    }
  }
  cout<<maxn;
}

WA10

image

2 个赞

dp的转移有些问题,应该通过判断a[i]与i,k,x,y相等的情况来判断产生的贡献,进行转移。而且直接把a[i]作为下标在a[i]==3的时候会越界