这题是讲有N个城市,每个城市都有魅力值,求能直飞到达各地最终返回目的地的最大魅力值。
可以很容易想到转移方程:dp[i]=max(dp[j])+mi[i];
代码:
View Code
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 int mi[105],dp[105],ans[105],f[105]; 6 bool map[105][105]; 7 8 int main() 9 { 10 int ca,n,m; 11 int i,j,x,y,p=1; 12 cin>>ca; 13 while(p<=ca) 14 { 15 memset(dp,0,sizeof(dp)); 16 memset(map,0,sizeof(map)); 17 cin>>n; 18 for(i=1;i<=n;i++) 19 cin>>mi[i]; 20 mi[n+1]=0; 21 cin>>m; 22 for(i=1;i<=m;i++) 23 { 24 cin>>x>>y; 25 map[x][y]=1; 26 } 27 f[1]=-1; 28 for(i=2;i<=n+1;i++) 29 for(j=1;j<i;j++) 30 if(map[j][i]&&mi[i]+dp[j]>dp[i]) 31 { 32 dp[i]=mi[i]+dp[j]; 33 f[i]=j; 34 } 35 int k=n+1; 36 i=0; 37 while(f[k]!=-1) 38 { 39 ans[i++]=f[k]; 40 k=f[k]; 41 } 42 cout<<"CASE "<<p<<'#'<<endl; 43 cout<<"points : "<<dp[n+1]<<endl; 44 cout<<"circuit : "; 45 for(j=i-1;j>=0;j--) 46 cout<<ans[j]<<"->"; 47 cout<<'1'<<endl; 48 if(p<ca) 49 cout<<endl; 50 p++; 51 } 52 return 0; 53 }
这里用f【】数组存储所能达到得地方。