hdu1224Free DIY Tour
看题目时忽略了一个条件,就是只能从1 到2,不可以从2到1,其实这个原本就应该排除掉的,可是我还在犹豫这个用不用考虑
接着弄上我的代码,不过presentance error
#include "iostream" #include "string.h" using namespace std; int main(){ int ncase,top=1,map[110][110],dp[110],num[110],n,i,m,a,b,j,list[110],path[110]; cin>>ncase; while(ncase--){ cin>>n; memset(num,0,sizeof(num)); for(i=1;i<=n;i++)cin>>num[i]; cin>>m; memset(map,0,sizeof(map)); memset(dp,0,sizeof(dp)); for(i=1;i<=m;i++){ cin>>a>>b; map[a][b]=1; } for(i=1;i<n+1;i++){ for(j=i+1;j<=n+1;j++){ if(map[i][j]&&dp[j]<dp[i]+num[j]){ dp[j]=dp[i]+num[j]; path[j]=i; } } //for(j=1;j<=n+1;j++)cout<<dp[j]<<' ';cout<<endl; } j=n+1;list[1]=1; for(i=2;;i++){ list[i]=path[j]; if(path[j]==1)break; j=path[j]; } cout<<"CASE "<<top++<<'#'<<endl; cout<<"points : "<<dp[n+1]<<endl; cout<<"circuit : "; for(j=i;j>=1;j--){ cout<<list[j]; if(j!=1)cout<<"->"; }cout<<endl; } }
网上的答案
#include<iostream> #include<string> using namespace std; int mi[105],dp[105],ans[105],f[105]; bool map[105][105]; int main() { int ca,n,m; int i,j,x,y,p=1; cin>>ca; while(p<=ca) { memset(dp,0,sizeof(dp)); memset(map,0,sizeof(map)); cin>>n; for(i=1;i<=n;i++) cin>>mi[i]; mi[n+1]=0; cin>>m; for(i=1;i<=m;i++) { cin>>x>>y; map[x][y]=1; } f[1]=-1; for(i=2;i<=n+1;i++) for(j=1;j<i;j++) if(map[j][i]&&mi[i]+dp[j]>dp[i]) { dp[i]=mi[i]+dp[j]; f[i]=j; } int k=n+1; i=0; while(f[k]!=-1) { ans[i++]=f[k]; k=f[k]; } cout<<"CASE "<<p<<'#'<<endl; cout<<"points : "<<dp[n+1]<<endl; cout<<"circuit : "; for(j=i-1;j>=0;j--) cout<<ans[j]<<"->"; cout<<'1'<<endl; if(p<ca) cout<<endl; p++; } return 0; }