【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;
}
设有一个三角形的数塔,顶点结点称为根结点,每个结点有一个整数数值。从顶点出发,可以向左走,也可以向右走。
问题:当三角形数塔给出之后,找出一条从第一层到达底层的路径,使路径的值最大。若这样的路径存在多条,任意给出一条即可。
步骤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;
}
相关文章推荐
- 【Algothrim】动态规划实例(0、1背包问题)
- 动态规划--数字三角形问题
- 动态规划学习(1)-数字三角形问题
- (动态规划)数字三角形问题
- hdu 1176 免费馅饼(动态规划 数字三角形问题变形)
- SDUT_数字三角形问题_动态规划
- 数字三角形问题--动态规划练习(1)
- poj 1163数字三角形问题--动态规划
- 动态规划解决数字塔-数字三角形问题
- sdut.acm 2012级《程序设计基础Ⅱ)》_动态规划 数字三角形问题
- 动态规划 问题之数字三角形(倒序递推)
- 动态规划之数字三角形问题
- 数字三角形问题 (动态规划初步)
- 【动态规划】数字三角形问题
- 数字三角形问题
- 3-4 数字三角形问题
- 数字三角形 (动态规划与递归)
- 数字三角形(动态规划)
- 数字三角形问题
- sdut 1730 数字三角形问题