2 5 3 83 86 77 15 93 35 86 92 49 3 3 3 1 2 10 5 36 11 68 67 29 82 30 62 23 67 35 29 2 22 58 69 67 93 56 11 42 29 73 21 19 -1 -1 5 -1 4 -1 -1 -1 4 -1
270 625
//1660K 1057B #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int dp[107][57],scor[57][57],a[107]; int main() { int t,n,m; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) for(int j=1;j<=m;j++) scanf("%d",&scor[i][j]); for(int i=1;i<=n;i++) scanf("%d",&a[i]); memset(dp,0,sizeof(dp)); for(int i=2;i<=n;i++) { if(a[i]>0) { if(a[i-1]>0)//(a,b) { dp[i][a[i]]=dp[i-1][a[i-1]]+scor[a[i-1]][a[i]]; } else//(?,b) { for(int j=1;j<=m;j++) { dp[i][a[i]]=max(dp[i][a[i]],dp[i-1][j]+scor[j][a[i]]); } } } else { for(int j=1;j<=m;j++) { if(a[i-1]>0)//(a,?) { dp[i][j]=max(dp[i][j],dp[i-1][a[i-1]]+scor[a[i-1]][j]); } else//(?,?) { for(int k=1;k<=m;k++) { dp[i][j]=max(dp[i][j],dp[i-1][k]+scor[k][j]); } } } } } int ans=-1; for(int i=1;i<=m;i++) ans=max(ans,dp[n][i]); printf("%d\n",ans); } return 0; }
原文:http://blog.csdn.net/crescent__moon/article/details/44654675