USACO 5.4 Canada Tour(DP)

这个题和传纸条差不多,但是我没想到。。还是在解决只走一次时候,没想到怎么办。dp[i][j]代表一条走到i和另一条走到j的最多结点。

假如某点走了两次那么他一定是从dp[i][i]走来的,但是dp[i][i] = 0,所以根本没有这种情况。

 1 /*
 2 ID: cuizhe
 3 LANG: C++
 4 TASK: tour
 5 */
 6 #include <iostream>
 7 #include <cstdio>
 8 #include <cstring>
 9 #include <algorithm>
10 #include <map>
11 using namespace std;
12 map<string,int> mp;
13 int p[101][101];
14 int o[101],first[101];
15 int dp[101][101];
16 int t,ans,n;
17 int main()
18 {
19     int m,i,j,k,u,v;
20     char str[101],str1[101];
21     freopen("tour.in","r",stdin);
22     freopen("tour.out","w",stdout);
23     scanf("%d%d",&n,&m);
24     for(i = 1;i <= n;i ++)
25     {
26         scanf("%s",str);
27         mp[str] = i;
28     }
29     for(i = 1;i <= m;i ++)
30     {
31         scanf("%s%s",str,str1);
32         u = mp[str];
33         v = mp[str1];
34         p[u][v] = 1;
35         p[v][u] = 1;
36     }
37     dp[1][1] = 1;
38     for(i = 1;i <= n;i ++)
39     {
40         for(j = i+1;j <= n;j ++)
41         {
42             for(k = 1;k < j;k ++)
43             {
44                 if(p[j][k]&&dp[i][k])
45                 {
46                     dp[i][j] = dp[j][i] = max(dp[i][j],dp[i][k] + 1);
47                 }
48             }
49         }
50     }
51     ans = 1;
52     for(i = 1;i <= n;i ++)
53     {
54         if(p[i][n])
55         {
56             ans = max(ans,dp[i][n]);
57         }
58     }
59     printf("%d\n",ans);
60     return 0;
61 }

 

posted @ 2013-05-28 19:54  Naix_x  阅读(237)  评论(0编辑  收藏  举报