这题是讲有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【】数组存储所能达到得地方。

 

posted on 2012-07-31 10:58  xinmenghuairi  阅读(283)  评论(0编辑  收藏  举报