Sicily 1211. 商人的宣传

本文介绍了一种使用动态规划算法解决特定路径问题的方法。通过构建状态转移方程,计算在限定天数内从一个地点到另一个地点的所有可能路径数量。代码实现中运用了结构体来表示边,并详细展示了如何进行动态规划的状态转移。

题目链接在此


受到这位大神的启示。


动态规划。
       状态转移方程: f[l][a][b] += f[l-1][a][t] * c[t][b]

f[l][a][b] 表示 l 天之内 从 a 地到达 b 地的路线总数, c[ a ][ b ] 表示 从 a 地可以直接到达 b 地,其值等于1)

 

代码如下:

#include <iostream>
#include <stdio.h>
#include <string.h>

#pragma warning(disable:4996)

using namespace std;

struct edge {
	int start, end;

	edge() {}
	edge(int s, int e) :start(s), end(e) {}
};

int connect[110][110][110] = { 0 };

int main() {
	int nodeNum, edgeNum, limitDays;
	edge map[10100];	
	int u, v;
	int queryNum;

	memset(connect, 0, sizeof(connect));

	scanf("%d%d%d", &nodeNum, &edgeNum, &limitDays);

	for (int i = 1; i <= edgeNum; i++) {
		scanf("%d%d", &u, &v);
		map[i] = edge(u, v);
		connect[1][u][v] = 1;
	}

	for (int a = 2; a <= limitDays; a++)
		for (int i = 1; i <= nodeNum; i++)
			for (int j = 1; j <= edgeNum; j++)
				connect[a][i][map[j].end] += connect[a - 1][i][map[j].start];

	scanf("%d", &queryNum);

	while (queryNum--) {
		scanf("%d%d", &u, &v);

		printf("%d\n", connect[limitDays][u][v]);
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值