TYVJ 1044 数字三角形

来源:互联网 发布:哈长城市群知乎 编辑:程序博客网 时间:2024/04/25 15:02

题目描述

示出了一个数字三角形。  请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大。  每一步可沿左斜线向下或右斜线向下走;  1< 三角形行数< 25;  三角形中的数字为整数< 1000;

输入

第一行为N,表示有N行 后面N行表示三角形每条路的路径权

输出

路径所经过的数字的总和最大的答案

样例输入

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

样例输出

30

典型的动态规划题目,可以把当前位置(i,j)看成是一个状态,然后定义(i,j)的指标函数d(i,j)为从格子(i,j)出发时能得到的最大和(包括(i,j)本身的值),在这个状态下,原问题的解就是d(1,1)的值。从格子(i,j)出发有两种选择。往左斜下走,则走到(i+1,j),则需要计算d(i+1,j)的值。类似的,往右走,则走到(i+1,j+1),需要计算d(i+1,j+1)的值,由于d(i,j)有应尽可能的取较大的值,所以要选择d(i+1,j)和d(i+1,j+1)中较大的一个。得到状态转移方程 d(i,j)=a(i,j)+max{d(i+1,j),d(i+1,j+1)}


#include<iostream>#include<cstdio>using namespace std;const int maxn=110;int a[maxn][maxn],b[maxn][maxn],n;void data_set(){    for(int i=1;i<=n;i++){        for(int j=1;j<=i;j++){           cin>>a[i][j];        }    }}void solve(){    for(int j=1;j<=n;j++)         b[n][j]=a[n][j];    for(int i=n-1;i>=1;i--)        for(int j=1;j<=i;j++){            if(b[i+1][j+1]>b[i+1][j])                b[i][j]=b[i+1][j+1]+a[i][j];            else                b[i][j]=b[i+1][j]+a[i][j];        }    cout<<b[1][1];}int main(){freopen("test.txt","r",stdin);    freopen("tested.txt","w",stdout);    while(cin>>n && n!=0)   {        data_set();        solve();cout<<endl;    }   return 0;}






0 0