要求走法有两种 ,从下或从右下。设阶段m[i][j]为从i行j列到底部的最大和,那么本题的解为m[1][1].
决策为if(m[row+1][col]>m[row+1][col+1]) 即取两种走法的较大者。
m[row][col]+=m[row+1][col];
else
m[row][col]+=m[row+1][col+1];
典型的动态规划,从底向上递推。
简单的dp。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int n;
int a[101][101];
int m[101][101];
int main()
{
freopen("in.txt","r",stdin);
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
cin>>a[i][j];
m[i][j]=a[i][j];//初始化m[i][j]为a[i][j]
}
}
for(int row=n-1;row>=1;row--)
{
for(int col=1;col<=row;col++)
{
if(m[row+1][col]>m[row+1][col+1])
m[row][col]+=m[row+1][col];
else
m[row][col]+=m[row+1][col+1];
}
}
cout<<m[1][1]<<endl;
return 0;
}