题目链接在此。
受到这位大神的启示。
动态规划。
状态转移方程: 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;
}
本文介绍了一种使用动态规划算法解决特定路径问题的方法。通过构建状态转移方程,计算在限定天数内从一个地点到另一个地点的所有可能路径数量。代码实现中运用了结构体来表示边,并详细展示了如何进行动态规划的状态转移。
1782

被折叠的 条评论
为什么被折叠?



