POJ 1163 动态规划

本文系作者原创,转载请注明出处:https://blog.csdn.net/coder_what/article/details/83832160


题目链接:http://poj.org/problem?id=1163

题目算法:动态规划;可参考我的博客:https://blog.csdn.net/coder_what/article/details/83626100

递归边界:当遍历到最后一行时

状态转移方程:

Sum[i][j]=Max(MaxSum(i+1,j),MaxSum(i+1,j+1))+num[i][j]

法一(递归+储存):

递归的思路就是从上到下一直遍历,直到到达边界为止。

c语言的ac代码如下:

//Peking University ACM 1163
//Algorithm: LCS
#include
#define max 101
int Max(int,int); //求最大值 
int MaxSum(int,int); //求最大的和
void Zero();//将Sum中的数全化为0 
int num[max][max]; //用来输入 
int Sum[max][max]; //用来储存算出来的和(用空间换时间,LCS的精华所在) 
int LineNumber; //行数 
int main()
{
	scanf("%d",&LineNumber);
	for(int i=0;i=b)	return a;
	return b;
}
int MaxSum(int i,int j)
{
	if(i==LineNumber-1)	return num[i][j];
	//边界:到达最下边,终止循环 ;-1是因为数组初始值为0 
	if(Sum[i][j]!=0) 	return Sum[i][j];
	//如果之前算过这个数,即存到了这个数组之中,则直接返回 
	else Sum[i][j]=Max(MaxSum(i+1,j),MaxSum(i+1,j+1))+num[i][j];
	return Sum[i][j];
}

法二(递推+储存):

递推的思路是从下往上走,第四行找到第五行最大的相加,第三行与第四行和第五行的和相加

C语言的ac代码如下:

//Peking University ACM 1163
//Algorithm: LCS
#include
#define max 101
int Max(int,int); //求最大值 
int MaxSum(); //求最大的和
void Zero();//将Sum中的数全化为0 
int num[max][max]; //用来输入 
int Sum[max][max]; //用来储存算出来的和(用空间换时间,LCS的精华所在) 
int LineNumber; //行数 
int main()
{
	scanf("%d",&LineNumber);
	for(int i=0;i=b)	return a;
	return b;
}
int MaxSum()
{
	int i,j;
	for(i=0;i=0;i--)//从下往上 (从到数第一行开始) 
		for(j=0;j

 

 

你可能感兴趣的:(算法和数据结构)