user-0 提问: 最小值的计算

回复:
user: user-1
content: 引用 19 楼 zhaocanxing 的回复:[quote=引用 5 楼 shangyu0801 的回复:]  #include <stdio.h>  #define LINE 10 #define COL  10 int Array[LINE][COL]= { 	{0,2,1,3,1,2,3,2,1,1}, 	{1,3,1,1,1,2,3,4,1,1}, 	{1,2,1,1,2,2,2,3,1,2}, 	{2,3,2,1,3,2,1,3,2,2}, 	{2,3,3,3,3,5,2,5,3,4}, 	{3,4,2,1,1,2,3,4,1,1}, 	{1,1,1,1,2,2,2,1,1,1}, 	{2,2,2,3,3,3,4,4,3,2}, 	{3,4,2,2,2,2,3,3,3,3}, 	{3,3,2,2,3,4,3,3,3,0}, };  int min(int m,int n) { 	int val,val1,val2; 	/*结束条件判断*/ 	if((m == LINE)&&(n == COL)){ 		//goal 		return 0; 	}else if(m == LINE){ 		//低边线了 向左走 		return Array[m-1][n] + min(m,n+1);	 	}else if(n == COL){ 		//左边线了 向下走 		return Array[m][n -1] + min(m+1,n);	 	}else{ 		//比较临近的值 		val = Array[m][n];	 		val1 = min(m+1,n); 		val2 = min(m,n+1); 		return (val1 < val2 ? val1 + val : val2 + val); 	} }  int main() { 	printf("min val =%d\n",min(0,0)); 	return 0; }  这样符合题意么，使用递归去理解还是挺简单的   }else if(m == LINE){ 		//低边线了 向左走 		return Array[m-1][n] + min(m,n+1);  这段不是很懂，m = LINE的时候不是应该往右走的吗？应该return Array[m][n] + min(m, n+1);才对的吧？[/quote] 呵呵，左右没分清，对的，向右走。m==LINE对于数组是越界了，所以我没用到这个数，你看下。

user: user-2
content: 蛮有意思的，先记下了

user: user-3
content: 引用 5 楼 shangyu0801 的回复: #include <stdio.h>  #define LINE 10 #define COL  10 int Array[LINE][COL]= { 	{0,2,1,3,1,2,3,2,1,1}, 	{1,3,1,1,1,2,3,4,1,1}, 	{1,2,1,1,2,2,2,3,1,2}, 	{2,3,2,1,3,2,1,3,2,2}, 	{2,3,3,3,3,5,2,5,3,4}, 	{3,4,2,1,1,2,3,4,1,1}, 	{1,1,1,1,2,2,2,1,1,1}, 	{2,2,2,3,3,3,4,4,3,2}, 	{3,4,2,2,2,2,3,3,3,3}, 	{3,3,2,2,3,4,3,3,3,0}, };  int min(int m,int n) { 	int val,val1,val2; 	/*结束条件判断*/ 	if((m == LINE)&&(n == COL)){ 		//goal 		return 0; 	}else if(m == LINE){ 		//低边线了 向左走 		return Array[m-1][n] + min(m,n+1);	 	}else if(n == COL){ 		//左边线了 向下走 		return Array[m][n -1] + min(m+1,n);	 	}else{ 		//比较临近的值 		val = Array[m][n];	 		val1 = min(m+1,n); 		val2 = min(m,n+1); 		return (val1 < val2 ? val1 + val : val2 + val); 	} }  int main() { 	printf("min val =%d\n",min(0,0)); 	return 0; }  这样符合题意么，使用递归去理解还是挺简单的   }else if(m == LINE){ 		//低边线了 向左走 		return Array[m-1][n] + min(m,n+1);  这段不是很懂，m = LINE的时候不是应该往右走的吗？应该return Array[m][n] + min(m, n+1);才对的吧？

user: user-4
content: 引用 17 楼 tengerye 的回复:[quote=引用 16 楼 Adol1111 的回复:] [quote=引用 14 楼 tengerye 的回复:] 。。。我也是菜鸟一枚。只不过以前有个同学特爱递归，结果最后关键时候栈溢出吃大亏了。 话说楼主哪里去了？ 用尾递归就好了，效率、空间上比递归要好多了（编译器开优化），而且还能保持递归的直观性。[/quote] 好像java编译器不能支持尾递归。其实我的意思也不是不能用，因为养成了“洁癖”，每次对复杂度特别关注，所以我是坚决不用的。还有就是怕大家吃了我同学的亏，好像的提醒一下。[/quote] ....完全没必要吧，递归有递归的优点，也有自己的缺陷。任何东西都是一样的，只要自己掌握好尺度就可以了。 至于语言不支持那我也没办法了。

user: user-5
content: 引用 16 楼 Adol1111 的回复:[quote=引用 14 楼 tengerye 的回复:] 。。。我也是菜鸟一枚。只不过以前有个同学特爱递归，结果最后关键时候栈溢出吃大亏了。 话说楼主哪里去了？ 用尾递归就好了，效率、空间上比递归要好多了（编译器开优化），而且还能保持递归的直观性。[/quote] 好像java编译器不能支持尾递归。其实我的意思也不是不能用，因为养成了“洁癖”，每次对复杂度特别关注，所以我是坚决不用的。还有就是怕大家吃了我同学的亏，好像的提醒一下。

user: user-1
content: 引用 10 楼 tengerye 的回复:[quote=引用 9 楼 shangyu0801 的回复:] [quote=引用 7 楼 tengerye 的回复:] [quote=引用 5 楼 shangyu0801 的回复:]  #include <stdio.h>  #define LINE 10 #define COL  10 int Array[LINE][COL]= { 	{0,2,1,3,1,2,3,2,1,1}, 	{1,3,1,1,1,2,3,4,1,1}, 	{1,2,1,1,2,2,2,3,1,2}, 	{2,3,2,1,3,2,1,3,2,2}, 	{2,3,3,3,3,5,2,5,3,4}, 	{3,4,2,1,1,2,3,4,1,1}, 	{1,1,1,1,2,2,2,1,1,1}, 	{2,2,2,3,3,3,4,4,3,2}, 	{3,4,2,2,2,2,3,3,3,3}, 	{3,3,2,2,3,4,3,3,3,0}, };  int min(int m,int n) { 	int val,val1,val2; 	/*结束条件判断*/ 	if((m == LINE)&&(n == COL)){ 		//goal 		return 0; 	}else if(m == LINE){ 		//低边线了 向左走 		return Array[m-1][n] + min(m,n+1);	 	}else if(n == COL){ 		//左边线了 向下走 		return Array[m][n -1] + min(m+1,n);	 	}else{ 		//比较临近的值 		val = Array[m][n];	 		val1 = min(m+1,n); 		val2 = min(m,n+1); 		return (val1 < val2 ? val1 + val : val2 + val); 	} }  int main() { 	printf("min val =%d\n",min(0,0)); 	return 0; }  这样符合题意么，使用递归去理解还是挺简单的  这位兄台，你用递归去遍历是2^2(n-1)复杂度的，n是正方形的长度。[/quote] 求更快的方案。。。[/quote] 更快的我已经说了阿，兄台。[/quote] 这个算法我也想到了，这个递归是没有任何剪枝的遍历，可以说是最大的复杂度，。不过对这些优秀的算法都不熟，不怎么会分析，大虾能以此为例给我普及下动态规划么？不胜感激。

user: user-6
content: 学习。。。。。。。

user: user-4
content: 引用 14 楼 tengerye 的回复:。。。我也是菜鸟一枚。只不过以前有个同学特爱递归，结果最后关键时候栈溢出吃大亏了。 话说楼主哪里去了？ 用尾递归就好了，效率、空间上比递归要好多了（编译器开优化），而且还能保持递归的直观性。

user: user-5
content: 动态规划在算分导论里已经说的比较清楚，如果没有这本书的话，可以上维基百科，里面有这个词条。祝好运了。

user: user-5
content: 。。。我也是菜鸟一枚。只不过以前有个同学特爱递归，结果最后关键时候栈溢出吃大亏了。 话说楼主哪里去了？

user: user-1
content: 引用 7 楼 tengerye 的回复:[quote=引用 5 楼 shangyu0801 的回复:]  #include <stdio.h>  #define LINE 10 #define COL  10 int Array[LINE][COL]= { 	{0,2,1,3,1,2,3,2,1,1}, 	{1,3,1,1,1,2,3,4,1,1}, 	{1,2,1,1,2,2,2,3,1,2}, 	{2,3,2,1,3,2,1,3,2,2}, 	{2,3,3,3,3,5,2,5,3,4}, 	{3,4,2,1,1,2,3,4,1,1}, 	{1,1,1,1,2,2,2,1,1,1}, 	{2,2,2,3,3,3,4,4,3,2}, 	{3,4,2,2,2,2,3,3,3,3}, 	{3,3,2,2,3,4,3,3,3,0}, };  int min(int m,int n) { 	int val,val1,val2; 	/*结束条件判断*/ 	if((m == LINE)&&(n == COL)){ 		//goal 		return 0; 	}else if(m == LINE){ 		//低边线了 向左走 		return Array[m-1][n] + min(m,n+1);	 	}else if(n == COL){ 		//左边线了 向下走 		return Array[m][n -1] + min(m+1,n);	 	}else{ 		//比较临近的值 		val = Array[m][n];	 		val1 = min(m+1,n); 		val2 = min(m,n+1); 		return (val1 < val2 ? val1 + val : val2 + val); 	} }  int main() { 	printf("min val =%d\n",min(0,0)); 	return 0; }  这样符合题意么，使用递归去理解还是挺简单的  这位兄台，你用递归去遍历是2^2(n-1)复杂度的，n是正方形的长度。[/quote] 求更快的方案。。。

user: user-7
content: 节点上的数值范围确定的话，就用A-star  范围不定或者浮动变化很大就用dijkstra吧。都是比较简单的算法，网上也多，我就不码代码了。

user: user-5
content: 引用 9 楼 shangyu0801 的回复:[quote=引用 7 楼 tengerye 的回复:] [quote=引用 5 楼 shangyu0801 的回复:]  #include <stdio.h>  #define LINE 10 #define COL  10 int Array[LINE][COL]= { 	{0,2,1,3,1,2,3,2,1,1}, 	{1,3,1,1,1,2,3,4,1,1}, 	{1,2,1,1,2,2,2,3,1,2}, 	{2,3,2,1,3,2,1,3,2,2}, 	{2,3,3,3,3,5,2,5,3,4}, 	{3,4,2,1,1,2,3,4,1,1}, 	{1,1,1,1,2,2,2,1,1,1}, 	{2,2,2,3,3,3,4,4,3,2}, 	{3,4,2,2,2,2,3,3,3,3}, 	{3,3,2,2,3,4,3,3,3,0}, };  int min(int m,int n) { 	int val,val1,val2; 	/*结束条件判断*/ 	if((m == LINE)&&(n == COL)){ 		//goal 		return 0; 	}else if(m == LINE){ 		//低边线了 向左走 		return Array[m-1][n] + min(m,n+1);	 	}else if(n == COL){ 		//左边线了 向下走 		return Array[m][n -1] + min(m+1,n);	 	}else{ 		//比较临近的值 		val = Array[m][n];	 		val1 = min(m+1,n); 		val2 = min(m,n+1); 		return (val1 < val2 ? val1 + val : val2 + val); 	} }  int main() { 	printf("min val =%d\n",min(0,0)); 	return 0; }  这样符合题意么，使用递归去理解还是挺简单的  这位兄台，你用递归去遍历是2^2(n-1)复杂度的，n是正方形的长度。[/quote] 求更快的方案。。。[/quote] 更快的我已经说了阿，兄台。

user: user-5
content: 奉劝各位兄台一句，用递归容易溢出。所有递归都可以转化为非递归的。

user: user-5
content: 引用 5 楼 shangyu0801 的回复: #include <stdio.h>  #define LINE 10 #define COL  10 int Array[LINE][COL]= { 	{0,2,1,3,1,2,3,2,1,1}, 	{1,3,1,1,1,2,3,4,1,1}, 	{1,2,1,1,2,2,2,3,1,2}, 	{2,3,2,1,3,2,1,3,2,2}, 	{2,3,3,3,3,5,2,5,3,4}, 	{3,4,2,1,1,2,3,4,1,1}, 	{1,1,1,1,2,2,2,1,1,1}, 	{2,2,2,3,3,3,4,4,3,2}, 	{3,4,2,2,2,2,3,3,3,3}, 	{3,3,2,2,3,4,3,3,3,0}, };  int min(int m,int n) { 	int val,val1,val2; 	/*结束条件判断*/ 	if((m == LINE)&&(n == COL)){ 		//goal 		return 0; 	}else if(m == LINE){ 		//低边线了 向左走 		return Array[m-1][n] + min(m,n+1);	 	}else if(n == COL){ 		//左边线了 向下走 		return Array[m][n -1] + min(m+1,n);	 	}else{ 		//比较临近的值 		val = Array[m][n];	 		val1 = min(m+1,n); 		val2 = min(m,n+1); 		return (val1 < val2 ? val1 + val : val2 + val); 	} }  int main() { 	printf("min val =%d\n",min(0,0)); 	return 0; }  这样符合题意么，使用递归去理解还是挺简单的  这位兄台，你用递归去遍历是2^2(n-1)复杂度的，n是正方形的长度。

user: user-8
content: 这个题为什么最近这么火，两次看到了！

user: user-1
content: #include <stdio.h>  #define LINE 10 #define COL  10 int Array[LINE][COL]= { 	{0,2,1,3,1,2,3,2,1,1}, 	{1,3,1,1,1,2,3,4,1,1}, 	{1,2,1,1,2,2,2,3,1,2}, 	{2,3,2,1,3,2,1,3,2,2}, 	{2,3,3,3,3,5,2,5,3,4}, 	{3,4,2,1,1,2,3,4,1,1}, 	{1,1,1,1,2,2,2,1,1,1}, 	{2,2,2,3,3,3,4,4,3,2}, 	{3,4,2,2,2,2,3,3,3,3}, 	{3,3,2,2,3,4,3,3,3,0}, };  int min(int m,int n) { 	int val,val1,val2; 	/*结束条件判断*/ 	if((m == LINE)&&(n == COL)){ 		//goal 		return 0; 	}else if(m == LINE){ 		//低边线了 向左走 		return Array[m-1][n] + min(m,n+1);	 	}else if(n == COL){ 		//左边线了 向下走 		return Array[m][n -1] + min(m+1,n);	 	}else{ 		//比较临近的值 		val = Array[m][n];	 		val1 = min(m+1,n); 		val2 = min(m,n+1); 		return (val1 < val2 ? val1 + val : val2 + val); 	} }  int main() { 	printf("min val =%d\n",min(0,0)); 	return 0; }  这样符合题意么，使用递归去理解还是挺简单的

user: user-5
content: 楼主，你得说清楚啊，“每一个a[][]赋值”，这些值里面有没有负数？如果有那就可能没有最小只有更小了。如果都是正数，那动态规划就可以了。总共的移动步子是固定的，数目是2*(n-1). Greedy Algorithm应该是不行的。 动态规划楼主应该会吧？

user: user-9
content: A star？似乎比a star简单

user: user-1
content: 这题目挺好玩。mark，有空看下。