【题解】AI作曲

一道简单的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]中找到答案输出即可