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 }

 

你可能感兴趣的:(USACO)