#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1010;
const int INF = 1000000000;
int dp[maxn];
int G[maxn][maxn];
int choice[maxn];
int vis[maxn];
int n;
//DAG最长路
int DP(int i){
if(dp[i] > 0) return dp[i]; //dp[i]已计算得到
for(int j = 0; j < n; j++){ //遍历i的所有出边
if(G[i][j] != INF){
dp[i] = max(dp[i], DP(j) + G[i][j]);
}
return dp[i]; //返回计算完毕的dp[i]
}
}
//DAG最长路径
int DP_(int i){
if(dp[i] > 0) return dp[i]; //dp[i]已计算得到
for(int j = 0; j < n; j++){ //遍历i的所有出边
if(G[i][j] != INF){
int temp = DP_(j) + G[i][j]; //单独计算,防止if中调用DP函数两次
if(temp > dp[i]){ //可以获得更长的路径
dp[i] = temp; //覆盖dp[i]
choice[i] = j; //i号顶点的后继顶点是j
}
}
}
return dp[i]; //返回计算完毕的dp[i]
}
//调用printPath前需要先得到最大的dp[i],然后将i作为路径起点传入
void printPath(int i){
printf("%d", i);
while(choice[i] != -1){ //choice数组初始化为-1
i = choice[i];
printf("->%d", i);
}
}
//从i号出发到达终点T的最长路径长度,初始化dp数组为-INF,dp[T]=0
int DP__(int i){
if(vis[i]) return dp[i]; //dp[i]已计算得到
vis[i] = true;
for(int j = 0; j < n; j++){ //遍历i的所有出边
if(G[i][j] != INF){
dp[i] = max(dp[i], DP__(j) + G[i][j]);
}
}
return dp[i]; //返回计算完毕的dp[i]
}
int main(){
return 0;
}
05-24