此题就是要得出最大的beautifulness。n表示song的notes的个数,m表示score(ai ,bj)(i=1,2,......m,j=1,2,....,m);求出相邻的notes i,j位置的score(i,j)相加(即beautifulness)的最大值。
将f[i][j]中i看作第i个位置选的notes j。
而当notes < 0 时是随机的,因此要分不同的情况:
1.a[i] > 0 a[i-1] > 0 f[i][a[i]] = f[i][a[i-1]] + score[a[i-1]][a[i]];
2.a[i] > 0 a[i-1] < 0 f[i][a[i]] = max(f[i][j]+score[j][a[i]]);
3.a[i] < 0 a[i-1] > 0 f[i][a[i]] = max(f[i][a[i-1]] + score[a[i-1]][j]);
4.a[i]<0 a[i-1]<0 f[i][j] = max(f[i][j]+score[j][k]);
#include
#include
#include
using namespace std;
int f[105][55];
int score[55][55];
int a[105];
int main()
{
int n,m,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
int i,j,k;
memset(f,0,sizeof(f));
for(i = 1; i <= m; i++)
for(j = 1; j <= m; j++)
scanf("%d",&score[i][j]);
for(i = 1; i <= n; i++)
scanf("%d",&a[i]);
for(i = 1; i <= m; i++)
f[1][i] = 0;
for(i = 2; i <= n; i++){
if(a[i] > 0){
if(a[i-1] > 0)
f[i][a[i]] = f[i-1][a[i-1]]+score[a[i-1]][a[i]];
else
for(j = 1; j <= m; j++)
f[i][a[i]] = max(f[i][a[i]],f[i-1][j]+score[j][a[i]]);
}
else{
if(a[i-1] < 0)
for(j = 1; j <= m; j++)
for(k = 1; k <= m; k++)
f[i][j] = max(f[i][j],f[i-1][k]+score[k][j]);
else{
for(j = 1; j <= m; j++)
f[i][j] = max(f[i][j],f[i-1][a[i-1]]+score[a[i-1]][j]);
}
}
}
int ans = 0;
for(j = 1; j <= m; j++)
ans = max(ans,f[n][j]);
printf("%d\n",ans);
}
}