Shortest Subchain

来源:互联网 发布:2016软件企业百强 编辑:程序博客网 时间:2024/06/05 18:47

Shortest Subchain

这里写图片描述
.
.
题意:给出一条链,问第一个点到最后一个点的最短路径,要求走过的边的顺序要和链的顺序相同(即不可以先走后面的边再走前面的边)。
.
.
解法:记忆化搜索就好了,记录每一个点最短路径以及从哪里转移过来的。注意的是记录转移不能直接记录从哪个点,因为记录点的话该点在后面的边加入时可能会改变该点前面的路径,所以要把路径投影到链上,记录从链的哪个点转移过来的。
.
.

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>using namespace std;const int maxn = 100010;int a[maxn], f[maxn], n, preid[maxn] = {0}, id[maxn], ans[maxn];int main() {    cin >> n;    n--;    for (int i = 0; i <= n; i++) scanf("%d", &a[i]);    memset(f, 255, sizeof(f));    f[a[0]] = 0;    id[a[0]] = 0;    preid[0] = -1;    for (int i = 1; i <= n; i++) {        if (f[a[i-1]]+1 < f[a[i]] || f[a[i]] == -1) {            preid[i] = id[a[i-1]];            id[a[i]] = i;            f[a[i]] = f[a[i-1]]+1;        }    }    ans[0] = 1;    ans[1] = a[n];    int t = id[a[n]];    while (1) {        t = preid[t];        if (t == -1) break;        ans[0]++;        ans[ans[0]] = a[t];    }    for (int i = ans[0]; i > 1; i--) printf("%d ", ans[i]);    printf("%d\n", ans[1]);}
0 0
原创粉丝点击