多段图动态规划dp

多段图问题是DP的基础题目。大体的意思是有一个赋权有向图,其顶点集被分为几个子集。求经过每个子集从源点到终点的最短路径

 1 import java.util.ArrayList;
 2 import java.util.Arrays;
 3 import java.util.Scanner;
 4 import java.util.Stack;
 5
 6 public class Main {
 7 private static final int k = 3;
 8 private static int[] P = new int[k];
 9
10 public static void MultiGraph(int[][] G,int n)
11 {
12     int[] COST = new int[n];
13
14     Arrays.fill(COST,100);
15     int[] D = new int[n];
16     int temp = 100;
17     COST[0]=0;
18     D[0]=0;
19     for(int j=1;j<n;j++)
20     {
21         for(int r = 0;r<j;r++)
22         {
23
24             if(G[j][r]!=0)
25             {
26                 if(COST[j]>COST[r] + G[j][r])
27                 {
28                     COST[j]=COST[r]+G[r][j];
29                     temp = r;
30
31                 }
32             }
33
34         }
35
36         D[j] = temp;
37     }
38     P[k-1]=D[n-1];
39     P[0]=0;
40     for(int j = 2;j>1;j--)
41     {
42         P[j-1] = D[P[j]];
43     }
44     for (int te: P
45          ) {
46         System.out.println(te);
47
48     }
49 }
50
51     public static void main(String[] args)
52     {
53         //新建一个树
54         int[][] G = {
55                 {0,2,3,4,0,0,0},
56                 {2,0,0,0,6,0,0},
57                 {3,0,0,0,5,0,0},
58                 {4,0,0,0,0,2,0},
59                 {0,6,5,0,0,0,3},
60                 {0,0,0,4,0,0,1},
61                 {0,0,0,0,3,1,0},
62         };
63
64         MultiGraph(G,7);
65
66     }
67
68 }
时间: 2024-10-21 17:00:55

多段图动态规划dp的相关文章

动态规划作业-多段图的最短路径问题

多段图的最短路径问题 问题:设图G=(V,E)是一个带权有向图,如果把顶点集合V划分成k个互不相交的子集Vi(2<=k<=n,1<=i<=k), 使得E中的任何一条边<u,v>,必有u∈Vi, v∈Vi+m(1<=i<k,1<i+m<=k),则称图G为多段图,称s∈V1为源点, t∈Vk为终点. 多段图的最短路径问题为从源点到终点的最小代价路径. 子问题:设Cuv表示多段图的有向边<u,v>上的权值,将从源点s到终点t的最短路径长度即

Fibonacci斐波拉契数列----------动态规划DP

n==10 20 30 40 50 46 体验一下,感受一下,运行时间 #include <stdio.h>int fib(int n){ if (n<=1)     return 1; else            return fib(n-1)+fib(n-2); }int main( ){ int n; scanf("%d",&n); printf("%d\n" ,fib(n) );} 先 n==10 20 30 40 50 46

动态规划(DP),类似LIS,FatMouse&#39;s Speed

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1108 解题报告: 1.首先按照weight从小到大排列,weight相同的按照speed从大到小排列; 2.Count[i]表示到第i个老鼠时,所求的最长“速度递减”子序列的长度: 3.path[i]=j是题目的关键,记录在Count[i]=Count[j]时,即最长“速度递减”子序列最后一个老鼠的前一只老鼠的位置 4.递归输出id void output(in

ZOJ 3644 Kitty&#39;s Game (图上DP 约数)

哎-这一场就做了三个题目,全队倒数第一,简直是太弱了. A Kitty's Game (ZOJ 3644) 题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3644 题意: 给出一个有向图,每个节点有一个权值pi, 有一个人从1节点出发(其权值为1节点的权值),前往n号节点,每经过一个节点,他的权值就变成了他经过这个节点前的权值和这个节点权值的最小公倍数,如果他经过这个节点后权值不发生变化则他就不能经过这个节点

(RQoj 15 采药------rwkj 10.1.5.253 1447) 动态规划 DP 1

#include <iostream>#include <string.h>using namespace std;int dp[105][1005], w[105],v[105],T,M;int max(int x,int y){ return x>y?x:y; } void f( ){ int i,j; for (i=1; i<=M; i++) for (j=0;j<=T; j++) { if (i==0) dp[i][j]=0; else dp[i][j]=

(RQoj 15 采药------rwkj 10.1.5.253 1447) 动态规划 DP 2

70 371 10069 11 2 #include <iostream>#include <string.h>using namespace std;int dp[105][1005], w[105],v[105],T,M;int max(int x,int y){ return x>y?x:y; }void f( ){ int i,j; for (i=M; i>=1; i--) for (j=0;j<=T; j++) { if (i==M+1) dp[i][j

(RQoj 15 采药------rwkj 10.1.5.253 1447) 动态规划 DP 3

#include <iostream>#include <string.h>using namespace std;int dp[1005], w[105],v[105],T,M;int max(int x,int y) { return x>y?x:y; }void f( ){ int i,j; for (i=1; i<=M; i++) for (j=T;j>=0; j--) if (j>=w[i]) dp[j]=max(dp[j],dp[j-w[i]]+

poj 3635 Full Tank? ( 图上dp )

题意: 已知每个点的加油站的油价单价(即点权),每条路的长度(边权). 有q个询问,每个询问包括起点s.终点e和油箱容量. 问从起点走到终点的最小花费.如果不可达输出impossible,否则输出最小的旅途费用. 算法: 其实要分析状态= =感觉就像是dp. 最直接的想法是  每到一个点都加上要走到下一个点所需要的油量.但是走的路不同,到底怎么处理加多少的问题呢? 因此想到分解状态,即拆点.每到一个点都+1单位的油量,然后把这个状态加入队列.另外如果现在油箱内的油足够达到下一点, 则更新状态,把

动态规划 DP

动态规划 DP 我们用f[ i ] 表示从 i 点出发到达终点的最多能休息的时间 然后我们发现 状态转移方程f[ i ] = f[ i+1 ] +1 ; 当该点 并没有工作计划时 f[ i ] = max(f[ i+len ],f[ i ]); 当该点 有工作计划时 一个或若干个 1 #include <bits/stdc++.h> 2 #define For(i,j,k) for(int i=j;i<=k;i++) 3 using namespace std ; 4 5 const i