一道简单的dp,我们可以设dp[i][j]为前i给数最后一个为j时的最大分数。接下来我们分4种情况讨论:1.如果a[i]于a[i-1]都已知,那么dp[i][a[i]]=dp[i-1][a[i-1]]+s[a[i-1]][a[i]];
2.如果a[i]已知,a[i-1]未知,那么dp[i][a[i]]=max(dp[i][a[i],dp[i-1][k]+s[k][a[i]]);
3.如果a[i]未知,a[i-1]已知,那么dp[i][j]=max(dp[i][j],dp[i-1][a[i-1]]+s[a[i-1]][j]);
4.如果a[i]和a[i-1]都未知,那么dp[i][j]=max(dp[i][j],dp[i-1][k]+s[k][j]);
for(int i=2;i<=n;i++){
if(a[i]>0&&a[i-1]>0)dp[i][a[i]]=dp[i-1][a[i-1]]+s[a[i-1]][a[i]];
else if(a[i]>0&&a[i-1]<0){
for(int k=1;k<=m;k++){
dp[i][a[i]]=max(dp[i][a[i]],dp[i-1][k]+s[k][a[i]]);
}
}
else if(a[i]<0&&a[i-1]<0){
for(int j=1;j<=m;j++){
for(int k=1;k<=m;k++){
dp[i][j]=max(dp[i][j],dp[i-1][k]+s[k][j]);
}
}
}
else if(a[i]<0&&a[i-1]>0){
for(int k=1;k<=m;k++){
dp[i][k]=max(dp[i][k],dp[i-1][a[i-1]]+s[a[i-1]][k]);
}
}
}
最后在dp[n][1-m]中找到答案输出即可