动态规划法将待求解问题分解成若干个相互重叠的子问题,每个子问题对应决策过程的一个阶段,一般来说,子问题的重叠关系表现在对给定问题求解的递推关系(也就是动态规划函数)中,将子问题的解求解一次并填入表中,当需要再次求解此子问题时,可以通过查表获得该子问题的解而不用再次求解,从而避免了大量重复计算。
动态规划法设计算法一般分成三个阶段: (1)分段:将原问题分解为若干个相互重叠的子问题; (2)分析:分析问题是否满足最优性原理,找出动态规划函数的递推式; (3)求解:利用递推式自底向上计算,实现动态规划过程。
数塔
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21539 Accepted Submission(s): 12961
有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

练习DP,通俗的数塔问题 也可自底向上 map[i][j]=data[i][j]+max(map[i+1][j],map[i+1][j+1])
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int data[105][105]; //存放初始数据
int map[105][105]; //存放路径上的和
int main()
{
int n,c;
while(scanf("%d",&c)!=EOF)
{
while(c--) {
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
scanf("%d",&data[i][j]);
map[1][1]=data[1][1];
for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++) {
//每点的路径和等于该节点data值与上层邻接map中的最大值之和
map[i][j]=data[i][j]+max(map[i-1][j],map[i-1][j-1]); }
int maxn=0;
for(int j=1;j<=n;j++)
//遍历最后一行找到找到路径最大值
maxn=max(maxn,map[n][j]);
printf("%d ",maxn);
}
}
return 0;
}