POJ 3249 記憶化搜尋,,,,DAG最長路

2021-08-22 04:34:59 字數 1644 閱讀 9524

題目大意:給出n個點,m條邊,每個點都提供了相對的點權值,然後給出相連著的邊,問從起點走到終點最大利潤值。起點是入度為0的點,終點是出度為0的點。

思路1:spfa求最長路,正向建邊tle,反向建邊4400msac。。。。

2:記憶化搜尋,每次都儲存當前點到終點獲得的最大利潤。

ac**,搜尋 ....1844ms:

#include#include#include#include#includeusing namespace std;

const int maxn = 100100;

const int inf = 0x3f3f3f3f3f;

int head[maxn];

int v[maxn];

int son[maxn];

struct node

node(int v,int next):v(v),next(next) {}

}edge[maxn*10];

int maxx = -inf;

int depth[maxn];

int dfs(int st)

int main()

for(int i = 1;i <= n;i ++)

if(son[i] == 0) dfs(i);

for(int i = 1;i <= n;i ++)

if(son[i] == 0 && depth[i] > maxx)

maxx = depth[i];

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

}return 0;

}

spfa 最長路...4400ms:

#include#include#include#include#include#includeusing namespace std;

const int maxn = 100100;

const int inf = 0x3f3f3f3f;

int head[maxn];

int v[maxn];

int dis[maxn];

int son[maxn];

int vis[maxn];

struct node

node(int v,int next,int w):v(v),next(next),w(w) {}

}edge[maxn*10];

int maxx = -inf;

int main()

maxx = -inf;

int a,b; int cnt = 0;

for(int i = 1;i <= n;i ++)

scanf("%d",&v[i]);

for(int i = 0;i < m;i ++)

queueq;

for(int i = 1;i <= n;i ++)

if(son[i] == 0)

while(!q.empty())}}

}for(int i = 1;i <= n;i ++)

if(head[i] == -1 && dis[i] > maxx)

maxx = dis[i];

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

}return 0;

}

poj 3249 bfs dp或者記憶化搜尋

思路 dp i 表示到點i的最大收益,初始化為 inf,然後從入度為0點開始bfs就可以了,一開始一直tle,然後優化了好久才4000ms險過。之後有寫了個dfs記憶化搜尋,果然快多了。bfs ac code 1 include2 include3 include4 include5 include...

POJ 3249 拓撲排序 動態規劃

該題是讓求在乙個有向無環圖中,從乙個入度為 0 的節點出發,到乙個出度為 0 的節點的最大的權值問題。我們可以使用廣搜,但是會超時,上網查了一下解題報告,可以使用拓撲排序 動態規劃來解決此問題 dp 1 max dp 2 cost 2 dp 4 dp 3 cost 3 dp 4 dp 4 cost ...

poj 1579(記憶化搜尋)

consider a three parameter recursive function w a,b,c if a 0 or b 0 or c 0,then w a,b,c returns 1 if a 20 or b 20 or c 20,then w a,b,c returns w 20,20...