动态规划

//dynamic programming to seek shortest route
#include <iostream.h>
//this program is edited by 200624101101杨振平
//this paper's edited time is DEC 3th,2008

//define the count of nodes less 1
#define N 15
//define a constant
#define NoEdge -1
//initial a graph
int a[N+1][N+1]=
{
 //0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
 { 0, 5, 3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},//0
 {-1, 0,-1, 1, 3, 6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},//1
 {-1,-1, 0,-1, 8, 7, 6,-1,-1,-1,-1,-1,-1,-1,-1,-1},//2
 {-1,-1,-1, 0,-1,-1,-1, 6, 8,-1,-1,-1,-1,-1,-1,-1},//3
 {-1,-1,-1,-1, 0,-1,-1, 3, 5,-1,-1,-1,-1,-1,-1,-1},//4
 {-1,-1,-1,-1,-1, 0,-1,-1, 3, 3,-1,-1,-1,-1,-1,-1},//5
 {-1,-1,-1,-1,-1,-1, 0,-1, 8, 4,-1,-1,-1,-1,-1,-1},//6
 {-1,-1,-1,-1,-1,-1,-1, 0,-1,-1, 2, 2,-1,-1,-1,-1},//7
 {-1,-1,-1,-1,-1,-1,-1,-1, 0,-1,-1, 1, 2,-1,-1,-1},//8
 {-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,-1, 3, 3,-1,-1,-1},//9
 {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,-1,-1, 3, 5,-1},//10
 {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,-1, 5, 2,-1},//11
 {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 6, 6,-1},//12
 {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,-1, 4},//13
 {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 3},//14
 {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0} //15
};
//define the array to store the add short route
int c[N+1][N+1];
//define the array to store the positiong of the add short route
int kay[N+1][N+1];
//main function
void main()
{
//define Allpairs function
void Allpairs(int n);
//define OutputPath function
void OutputPath(int i,int j);
//call Allpairs function
Allpairs(N);
//print the array of storing the add short route
for(int i=0;i<=N;i++)
{
 for(int j=0;j<=N;j++)
  cout<<c[i][j]<<" ";
  cout<<endl;
}
//call OutputPath function
OutputPath(0,N);
}
//implement Allpairs function
void Allpairs(int n)
{
//to seek the shortest route all the points
//to all the i and j,to calculate c [ i ] [ j ] and k a y [ i ] [ j ]
//initial c [ i ] [ j ] = c(i,j,0)
for (int i = 0; i <= n; i++)
for (int j = 0; j <= n; j++) {
c[i][j] = a[i][j];
kay[i][j] = 0;
}
for (i = 0; i <= n; i++)
c[i][i] = 0;
// to calculate c[i][j] = c(i,j,k)
for (int k = 0; k <= n; k++)
for (int i = 0; i <= n; i++)
for (int j = 0; j <= n; j++) {
int int1 = c[i][k];
int int2 = c[k][j];
int int3 = c[i][j];
if (int1 != NoEdge && int2 != NoEdge && (int3 == NoEdge || int1 + int2 < int3)) {
c[i][j] = int1 + int2;
kay[i][j] = k;}
}
}
//implement outputPath function to output shortest route
void outputPath(int i,int j)
{
// print the route from i to j
if (i == j) return;
if (kay[i][j] == 0) cout << j << ' ';
else {outputPath(i,kay[i][j]);
outputPath(kay[i][j],j);}
}
//implement OutputPath function
void OutputPath(int i,int j)
{
// print the shortest route from i to j
if (c[i][j] == NoEdge) {
cout << "there is no path from " << i << " into " << j << endl;
return ; }
cout << "the path is" << endl;
cout << i << ' ';
//call outputPath function
outputPath(i,j);
cout << endl;
}

时间: 2025-01-21 09:20:42

动态规划的相关文章

经典动态规划基础题-三角形最大和问题

三角形最大和问题 Time Limit:1000MS Memory Limit:65536K Total Submit:79 Accepted:22 Description 现在经常有一些数学问题困扰着小明.有如下一个三角形, 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 小明想求出从顶至底的某处的一条路径,使该路径所经过的数字的总和最大.现在想请你编一个程序实现这个问题. 说明: (1)每一步可沿左斜线向下或右斜线向下: (2)1<三角形行数≤100; (3)三角形中的数字为0,

代码-动态规划问题,求答案

问题描述 动态规划问题,求答案 Description 一个国家有n个城市(n不超过1000),一名旅行家住在最西边的城市里,他希望不重不漏地将每个城市浏览一遍.他的路线将是先向东经过一些城市到达最东边的城市,再向西依次经过剩余城市回到原来所在城市,任意两个城市均可直接相互到达.现给出所有城市的坐标,两个城市间的距离即为坐标两点间的直线距离.求旅行家所需走过的最短距离.Input第一行为整数n,是城市个数.接下来n行,每行两个整数xy,表示某个城市的坐标.保证坐标在32位整数范围内.保证最西和最

博弈树,动态规划(计算好的子问题存储起来,以后直接取用)

public class GameTree { /** * 判断剩余球数,谁能取到最后谁赢, * ,一人取一次,默认我方先取,,能否必胜,能就返回true,否则false * @param x剩余球数 * @return */ static boolean f(int x){ int[] op={1,3,7,8};//每次取球只能有四种情况 for(int i=0;i<op.length;i++){ if (x>=op[i]) { if(f(x-op[i])==false)return tru

从装配线到DNA比对——神器动态规划

对于一个问题,我们如果可以枚举所有的解,那么这个解空间我们是知道的.那么如何在解空间里面找到最优解呢?这时有一个非常好的方法,从底向上地构造整个解,而每一步都是从地层寻求最优解,这样就能保证在最终得到的一定是最优解.这就是最优子结构,有这种结构的问题,通常都可以用动态规划的办法来寻求最优解.而且它是从小规模(子问题)到大规模问题的构造,而常常这样的解法能够用一张表直观地表现出来.表中的元素是一个表达式的某个特定值,这个表达式表现的是问题和子问题的关系,也就是如何在子问题中的解中寻找最优的关系,这

动态规划(DP)入门

零.先修课程 首先,在开始理解DP的思想前,你需要 1. 完成HDU里面的递推求解专题练习(For Beginner)那7道题(这些题很简单,题解请在博客中搜索),这对你理解DP有很大的帮助. 2. 对递归搜索(比如深度优先搜索,DFS)有一定了解. 一.递归与记忆化搜索 我们从POJ 3176入手来学习这一思想.(题目很短,请快速读完) 从上往下看,最大和值无非是往左走和往右走这两条路的较大者.这样,我们可以写出下面这个重要的递归函数:(这里i表示行,j表示列) int f(int i, in

用动态规划算法对最大子串问题的java实现

最大字串问题描述大概就是给定2个字符串,找出他们两个共有的最长字符串.比如一个是"tabcfg"另外一个"abckj"那么最大子串就是"abc". 动态规划算法最重要的就是分解问题,找出递归.说一下我的思考思路,首先拿到2个字符串,如何找到最长子串呢? 1.假设他们(字符串a,b)的头字母不相同的话,那么分别去掉首字母比较,也就是说用a.subString(1)和b比较,用 b.subString(1)和a比较,最长子字符串没变吧?答案是肯定的.

PHP动态规划解决0-1背包问题实例分析

 这篇文章主要介绍了PHP动态规划解决0-1背包问题,实例分析了背包问题的原理与实现技巧,需要的朋友可以参考下     本文实例分析了PHP动态规划解决0-1背包问题.分享给大家供大家参考.具体分析如下: 背包问题描述:一个承受最大重量为W的背包,现在有n个物品,每个物品重量为t, 每个物品的价值为v. 要使得这个背包重量最大(但不能超过W),同时又需要背包的价值最大. 思路:定义一个二维数组,一维为物品数量(表示每个物品),二维是重量(不超过最大,这里是15),下面数组a, 动态规划原理思想,

通过金矿模型介绍动态规划

前面讲到了动态规划问题,在cnblogs上看到了一篇讲解动态规划的文章,十分有新意,故转载过来. 第一节  初识动态规划         经典的01背包问题是这样的:        有一个包和n个物品,包的容量为m,每个物品都有各自的体积和价值,问当从这n个物品中选择多个物品放在包里而物品体积总数不超过包的容量m时,能够得到的最大价值是多少?[对于每个物品不可以取多次,最多只能取一次,之所以叫做01背包,0表示不取,1表示取]        为了用一种生动又更形象的方式来讲解此题,我把此题用另一

一些常见的递归算法 动态规划算法

最大值的递归算法 对于一个数组 有A[ 1...n ] 算法调用的时候调用max(n) max(i) if i = 1 return A[i] else if A[i]>max(i-1) return A[i] else return max(i-1) end if end if 平均值的递归算法 对于数组 a[ 1...n ] sum 初值为 0 index 初值则为1 调用该算法使用 Ave(a,sum,index) Ave(int a[],int sum,int index) if(ind

[usaco]3.4.4 变形的动态规划问题Electric Fence

Electric Fence Don Piele In this problem, `lattice points' in the plane are points with integer coordinates. In order to contain his cows, Farmer John constructs a triangular electric fence by stringing a "hot" wire from the origin (0,0) to a la