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 }