题意:
给出一个数塔,求出从顶层到底层所经过的数字的最小(或者最大)和。
示例:
解决方案:
采用自底向上的动态规划方法,从最底层向上重构出新数塔,以最后一层为基础,从倒数第二层开始向上重新构造出新数塔,至顶层后唯一的一个数字就是最小值。
在这个过程中,推出arr[i][j]=Min(arr[i][j]左孩子,arr[i][j]右孩子)+arr[i][j],即:arr[i][j]=Min( arr[i+1][j],arr[i+1][j+1] )+arr[i][j]
示例代码:
#include"stdio.h"
#define N 100
int Min(int a,int b)
{
return a
}
int DP(int arr[N][N],int n)
{
int i,j;
for(i=n-2; i>=0; i--)
for(j=0; j<=i; j++)
arr[i][j]+=Min(arr[i+1][j],arr[i+1][j+1]);
return arr[0][0];
}
int main()
{
int n,arr[N][N];
int i,j;
while(scanf("%d",&n)&&n)
{
for(i=0; i
for(j=0; j<=i; ++j)
scanf("%d",&arr[i][j]);
printf("%d\n",DP(arr,n));
}
}