数塔dp
注意路径的输出
#include<bits/stdc++.h>
using namespace std;
int dp[120],p[120],pre[120];
int con[120][120];
void print(int x)
{
if(pre[x]!=0)
print(pre[x]);
printf("%d->",x);
}
int main()
{
int T,N,M,A,B;
scanf("%d",&T);
for(int kase=1;kase<=T;kase++)
{
memset(dp,0,sizeof(dp));
memset(con,0,sizeof(con));
memset(pre,0,sizeof(pre));
scanf("%d",&N);
for(int i=1;i<=N;i++)
scanf("%d",&p[i]);
p[N+1]=0;
scanf("%d",&M);
for(int i=1;i<=M;i++)
{
scanf("%d%d",&A,&B);
con[A][B]=1;
}
for(int i=1;i<=N+1;i++)
{
int maxp=0;
for(int j=1;j<=i+1;j++)
{
if(con[j][i]==1&&dp[j]>=maxp)
{
maxp=dp[j];
pre[i]=j;
}
}
dp[i]=maxp+p[i];
}
printf("CASE %d#\n",kase);
printf("points : %d\n",dp[N+1]);
printf("circuit : ");
print(pre[N+1]);
printf("1\n");
if(kase!=T)
printf("\n");
}
return 0;
}