【发布时间】:2016-02-23 10:46:01
【问题描述】:
我是编码初学者。我想使用简单的递归和数组来解决以下问题。但我无法想象它。我想出了使用链接列表的解决方案。以下是问题和我的解决方法
给定 n 行整数,使得第 i 行 (
1 <= i <= n) 包含 i 个整数。使用以下路径规则集,找到 具有最大权重的路径。路径遍历规则:
有效的路径序列是自上而下的,即从第一行的整数开始,遍历所有行,只选择一个 每行中的整数。
从第 i 行中的任何第 j 个整数,即
row[i][j],遍历可以发生向下(即到row[i+1][j])或斜向下 向右(即row[i+1][j+1])。Path 的权重是 Path 中整数值的总和 顺序。
例子:
No. of Rows: 5 4 2 9 15 1 3 16 92 41 44 8 142 6 4 8预期输出:4、2、15、92、142(最大重量为 255)
Sol.c
#include<stdio.h>
#include<stdlib.h>
int n,**ar;
struct n
{
int i,j;
int w;
struct n *ptr;
};
struct n* maxweight(int i,int j,struct n* x)
{
struct n* tmp=malloc(sizeof(struct n)),*t1,*t2;
tmp->i=i;
tmp->j=j;
tmp->ptr=x;
tmp->w=ar[i][j];
if(x)tmp->w+=x->w;
if(i==n-1)return tmp;
t1=maxweight(i+1,j,tmp);
t2=maxweight(i+1,j+1,tmp);
if(t1->w>t2->w)return t1;
return t2;
}
int main()
{
int i,j;
struct n * s;
printf("Enter the value of n\n");
scanf("%d",&n);
ar=malloc(n*sizeof(int*));
for(i=0;i<n;i++)
{
ar[i]=malloc((i+1)*sizeof(int));
for(j=0;j<=i;j++)scanf("%d",&ar[i][j]);
}
s=maxweight(0,0,NULL);
printf("MAX WEIGHT is :%d\nPATH: ",s->w);
while(s)
{
printf("%d ",ar[s->i][s->j]);
s=s->ptr;
}
printf("\n");
return 0;
}
如何在不使用 n x n 矩阵的链接列表的情况下简单地使用递归来解决这个问题?动态规划是否适用于这个问题。
【问题讨论】:
-
查找 DFS 和/或 BFS 算法。和一般的图搜索。
-
递归思考的关键是递归思考。
-
@Ike 在所有这些递归笑话中都有一个共同的问题。缺乏基本情况。
-
我认为它们会导致堆栈溢出。 :-D
-
@EugeneSh.: 你是说
if (joke == old) return 0;?这迟早会自动发生。
标签: c recursion dynamic-programming backtracking