您的位置:首页 > 编程语言 > Go语言

【Algothrim】 动态规划实例 (数字三角形问题)

2016-08-16 10:58 190 查看
问题描述

设有一个三角形的数塔,顶点结点称为根结点,每个结点有一个整数数值。从顶点出发,可以向左走,也可以向右走。

问题:当三角形数塔给出之后,找出一条从第一层到达底层的路径,使路径的值最大。若这样的路径存在多条,任意给出一条即可。

步骤1

二维数组D(X,y)描述问题,

D(X,y)表示从顶层到达第X层第y个位置的最小路径得分。

阶段分析:D(1,1)=13

到第x层的第y个位置有两种可能,要么走右分支
得到,要么走左分支得到。

步骤2:状态转移方程

D(X,y)=min{D(X-1,y),D(X-1,y-1}+a(X,y)

D(1,1)=a(1,1) 

Answer

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#define M 100
int map[M][M];
int dp[M][M];
int N;

int max(int a, int b)
{
if (a > b)
return a;
else
return b;
}
int main()
{
memset(map,0,sizeof(map));
memset(dp,0,sizeof(dp));

int i, j;
scanf("%d", &N);
for (i = 1; i <= N;i++)
{
for (j = 1; j <= i;j++)
{
scanf("%d",&map[i][j]);
}

}

/*for (i = 1; i <= N; i++)
{
for (j = 1; j <= i; j++)
{
printf("%8d", map[i][j]);
}
printf("\n");

}*/
dp[1][1] = map[1][1];

for (i = 1; i <=N; i++)
{
for (j = 1; j <= i; j++)
{
dp[i][j] = map[i][j]+ max(dp[i - 1][j], dp[i - 1][j - 1]);
/* printf("dp[%d][%d]=%d\n", i-1, j, dp[i-1][j]);
printf("dp[%d][%d]=%d\n", i - 1, j-1, dp[i - 1][j-1]);
printf("map[%d][%d]=%d\n", i, j, map[i][j]);
printf("dp[%d][%d]=%d\n", i,j,dp[i][j]);
printf("\n");*/
}
}

int Answer = -1;

for (i = 1; i <= N; i++)
{
for (j = 1; j <= i; j++)
{
Answer = max(Answer,dp[i][j]);
}
}
printf("%d\n", Answer);
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: