题目:商人的宣传

题目描述

Bruce在A州成立了公司,准备宣传活动开始后的第L天到达B州进行新品拍卖,期间Bruce打算将产品拿到各个州去做推销宣传。 该国有很多个州,每个州都与其他一些州相邻,但是该国有规定:

商人只能从某些州到达另外一些州,即连通路线是单向的。

商人不允许在同一个州连续宣传两天或以上,每天宣传完必须离开该州。

商人可以多次来到同一个州进行宣传。

任务:算出AB两州之间的路线的总数。

输入格式

第一行包含三个整数n,m,L(1≤n,L≤100),表示n个州、m条通路,L天后必须到达B州。

接下来有m行,每行一对整数x,y(1≤x,y≤n),表示从x州到y州有通路。

第m+2行:一个整数k(k≤100)

接下来k行,每行两个整数A,B

输出格式

k行,每行一个整数,表示从第k次输入的A州到第k次输入的B州满足规定的路线总数。(<2^31)

题解:

该题用的是动态规划。设f[i][j]为第j天到达i州的总方案数。

动态转移方程:

f[起始地][0]=1;

f[i][j]=max{f[i][j],f[k][i-1]+f[i][j]}//map[k][j]=1;

View Code
 1 #include<iostream>
2 using namespace std;
3
4 int f[101][101];bool map[101][101]={0};
5
6 int main()
7 {
8 int n,m,l,i,j,k,t;
9 cin>>n>>m>>l;
10
11 for(i=1;i<=m;i++)
12 {
13 int x,y;
14 cin>>x>>y;
15 map[x][y]=1;
16 }
17
18 cin>>t;
19 while(t)
20 {
21 int x,y;
22 memset(f,0,sizeof(f));
23 cin>>x>>y;
24 f[x][0]=1;
25
26 for(i=1;i<=l;i++)
27 for(j=1;j<=n;j++)
28 for(k=1;k<=n;k++)
29 if(map[k][j]==1)
30 f[j][i]=max(f[j][i],f[k][i-1]+f[j][i]);
31
32 cout<<f[y][l]<<endl;
33 t--;
34 }
35
36 return 0;
37
38 }
原文地址:https://www.cnblogs.com/noip/p/2357576.html