郁闷死啦,一道简单的DP,搞了好几个小时,结果输出错了,反序了,都怪测试例子是三个数,反序了也不知道呀,也怪自己……………………
#include<iostream> #include<string> using namespace std; int p[105],f[105],dp[105],ans[105]; bool map[105][105]; int main() { int a,b,n,m,cas,t=0; cin>>cas; while(cas--) { cin>>n; for(int i=1;i<=n;i++) cin>>p[i]; p[n+1]=0; memset(map,0,sizeof(map)); memset(dp,0,sizeof(dp)); cin>>m; for(int i=0;i<m;i++) { cin>>a>>b; map[a][b]=1; } f[1]=-1; for(int i=2;i<=n+1;i++) { for(int j=1;j<i;j++) if(map[j][i]&&p[i]+dp[j]>dp[i]) { dp[i]=p[i]+dp[j]; f[i]=j; } } int k=n+1,i=0; while(f[k]!=-1) { ans[i++]=f[k]; k=f[k]; } if(t++) cout<<endl; cout<<"CASE "<<t<<"#"<<endl<<"points : "<<dp[n+1]<<endl; cout<<"circuit : "; for(int j=i-1;j>=0;j--) cout<<ans[j]<<"->"; cout<<1<<endl; } return 0; }