USACO Seciton 5.4 Canada Tour(dp)

因为dp(i,j)=dp(j,i),所以令i>j. dp(i,j)=max(dp(k,j))+1(0<=k<i),若此时dp(i,j)=1则让dp(i,j)=0.(因为无法到达此状态,等于1是因为后来加1了).初始:dp(0,0)=1.answer: max(dp(i,n-1))(0<=i<n).比较难理解的是为什么状态转移时为什么不会出现重复,只要我们每次计算时没有计算重复点,那么之前的计算也不会有(因为是同样的dp计算方式),所以就不会重复.

-------------------------------------------------------------------------------

#include<cstdio>

#include<iostream>

#include<map>

#include<cstring>

#include<string>

#define rep(i,n) for(int i=0;i<n;i++)

#define Rep(i,l,r) for(int i=l;i<=r;i++)

#define clr(x,c) memset(x,c,sizeof(x))

using namespace std;

const int maxn=100;

map<string,int> Map;

int ok[maxn][maxn];

int d[maxn][maxn];

int n;

int dp(int a,int b) {

if(a<b) swap(a,b);

int &ans=d[a][b];

if(ans>=0) return ans;

ans=0;

if(a==b) return ans;

rep(i,a) if(ok[i][a] && a-b) ans=max(ans,dp(i,b));

return ans ? ++ans : ans;

}

void init() {

clr(d,-1); d[0][0]=1;

clr(ok,0);

int m;

string s[2];

cin>>n>>m;

rep(i,n) {

cin>>s[0];

Map[s[0]]=i;

}

rep(i,m) {

rep(j,2) cin>>s[j];

int a=Map[s[0]],b=Map[s[1]];

ok[a][b]=ok[b][a]=1;

}

}

void work() {

int ans=1;

rep(i,n) if(ok[i][n-1]) ans=max(ans,dp(i,n-1));

printf("%d\n",ans);

}

int main()

{

freopen("tour.in","r",stdin);

freopen("tour.out","w",stdout);

init();

work();

return 0;

}

-------------------------------------------------------------------------------

Canada Tour

You have won a contest sponsored by an airline. The prize is a ticket to travel around Canada, beginning in the most western point served by this airline, then traveling only from west to east until you reach the most eastern point served, and then coming back only from east to west until you reach the starting city. No city may be visited more than once, except for the starting city, which must be visited exactly twice (at the beginning and the end of the trip). You are not allowed to use any other airline or any other means of transportation.

Given a list of cities served by the airline and a list of direct flights between pairs of cities, find an itinerary which visits as many cities as possible and satisfies the above conditions beginning with the first city and visiting the last city on the list and returning to the first city.

PROGRAM NAME: tour

INPUT FORMAT

Line 1: The number N of cities served by the airline and the number V of direct flights that will be listed. N will be a positive integer not larger than 100. V is any positive integer.
Lines 2..N+1: Each line contains a name of a city served by the airline. The names are ordered from west to east in the input file. There are no two cities in the same meridian. The name of each city is a string of, at most, 15 digits and/or characters of the Latin alphabet; there are no spaces in the name of a city.
Lines N+2..N+2+V-1: Each line contains two names of cities (taken from the supplied list), separated by a single blank space. This pair is connected by a direct, two-way airline flight.

SAMPLE INPUT (file tour.in)

8 9	 Vancouver		 Yellowknife	 Edmonton Calgary Winnipeg Toronto	 Montreal Halifax	 Vancouver Edmonton Vancouver Calgary	 Calgary Winnipeg Winnipeg Toronto Toronto Halifax Montreal Halifax Edmonton Montreal Edmonton Yellowknife Edmonton Calgary 

OUTPUT FORMAT

Line 1: The number M of different cities visited in the optimal itinerary. Output 1 if no itinerary is possible.

SAMPLE OUTPUT (file tour.out)

7 

Namely: Vancouver, Edmonton, Montreal, Halifax, Toronto, Winnipeg, Calgary, and Vancouver (but that‘s not a different city).

时间: 2024-12-16 09:51:35

USACO Seciton 5.4 Canada Tour(dp)的相关文章

USACO 6.5 Betsy&#39;s Tour (插头dp)

Betsy's TourDon Piele A square township has been divided up into N2 square plots (1 <= N <= 7). The Farm is located in the upper left plot and the Market is located in the lower left plot. Betsy takes her tour of the township going from Farm to Mark

洛谷 P2747 [USACO5.4]周游加拿大Canada Tour

P2747 [USACO5.4]周游加拿大Canada Tour 题目描述 你赢得了一场航空公司举办的比赛,奖品是一张加拿大环游机票.旅行在这家航空公司开放的最西边的城市开始,然后一直自西向东旅行,直到你到达最东边的城市,再由东向西返回,直到你回到开始的城市.除了旅行开始的城市之外,每个城市只能访问一次,因为开始的城市必定要被访问两次(在旅行的开始和结束). 当然不允许使用其他公司的航线或者用其他的交通工具. 给出这个航空公司开放的城市的列表,和两两城市之间的直达航线列表.找出能够访问尽可能多的

HDU 1224 Free DIY Tour(DP)

Problem Description Weiwei is a software engineer of ShiningSoft. He has just excellently fulfilled a software project with his fellow workers. His boss is so satisfied with their job that he decide to provide them a free tour around the world. It's

【USACO 5.4.1】Canada Tour

题目大意 给出一个序列,序列中的每个元素是一个字符串.然后输入哪些元素可以互相到达.计算可以到达城市最多这样的一条路径,从序列开始的元素到达序列末端元素,再从序列末端元素返回序列开始元素,这条路径中所到达的元素不能重复(除起点外).序列最长是100. 题解 明显我们可以发现这样的一件事:从起点到达终点和从终点到达起点并没有什么不同. 所以,现在我们考虑两条从起点到达终点并且不相交的两条路径即可. 我们现在考虑一条路径怎么做.显然是使用DP:f[目前到达元素i] = max{f[j | 从起点可以

USACO Canada Tour

这道题的意思是平面上有一些点, 这些点从西向东分布,现在选一条路线从最西走向最东 在反过来走, 问选择一条路线走尽可能多的城市, 我们可以将这个问题看成两个人从最西边走向最东边, 定义f[i][j]为1走向i而2走向j的最大城市数,f[j][i] =  f[i][j] = max(f[i][k]) + 1,  1<=k<j, 结果就是max(f[i][N]), 代码如下: /* ID: m1500293 LANG: C++ PROG: tour */ #include <cstdio&g

POJ2677 Tour(DP+双调欧几里得旅行商问题)

Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3929   Accepted: 1761 Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts visiting beautiful places. To save money, John must

【USACO 2.2】Subset Sums (DP)

N (1 <= N <= 39),问有多少种把1到N划分为两个集合的方法使得两个集合的和相等. 如果总和为奇数,那么就是0种划分方案.否则用dp做. dp[i][j]表示前 i 个数划分到一个集合里,和为j的方法数. dp[i][j]=dp[i-1][j]+dp[i][j-i] n 为 39 时,1 到 39 的和为 780,枚举 j 的时候枚举到 s/2,最后输出dp[n][s/2]/2. http://train.usaco.org/usacoprob2?a=z5hb7MFUmsX&

USACO Section 5.3 Big Barn(dp)

USACO前面好像有类似的题目..dp(i,j)=min(dp(i+1,j),dp(i+1,j+1),dp(i,j+1))+1  (坐标(i,j)处无tree;有tree自然dp(i,j)=0) .dp(i,j)表示以坐标(i,j)为左上角的barn边长最大值,dp(i+1,j),dp(i,j+1)分别表示向右和向下能扩展的最大边长,但是以此为正方形时,右下方的一个格子没有考虑到,所以就+个dp(i+1,j+1).边界为:dp(i,j)=1(i==n-1或j==n-1). -----------

POJ2677 Tour[DP 状态规定]

Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4307   Accepted: 1894 Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts visiting beautiful places. To save money, John must