[DP]数字金字塔

来源:互联网 发布:android短信群发源码 编辑:程序博客网 时间:2024/04/30 11:55

SSL 1100 1458
洛谷 P1216 [USACO1.5]数字三角形 Number Triangles
题目描述
观察下面的数字金字塔。

写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。

     7   3   8 8   1   0 

2 7 4 4
4 5 2 6 5
在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大

分析
不多讲

//一维顺推#include <iostream>#include <cstdio>int f[1001],a[1001],n,i,j;int main(){    scanf("%d",&n);    scanf("%d",&a[1]);    f[1]=a[1];    for (i=2;i<=n;i++)     {        for (j=1;j<=i;j++) scanf("%d",&a[j]);        for (j=i;j>=1;j--)        {            if (a[j]+f[j]>a[j]+f[j-1]) f[j]=a[j]+f[j];             else f[j]=a[j]+f[j-1];        }     }    j=0;    for (i=1;i<=n;i++)        if (j<f[i]) j=f[i];    printf("%d\n",j);    return (0);}
//逆推法#include <iostream>#include <cstdio>int f[1001][1001],a[1001][1001],n,i,j;int main(){    scanf("%d",&n);    for (i=1;i<=n;i++)     for (j=1;j<=i;j++)      scanf("%d",&a[i][j]);    for (i=1;i<=n;i++)     f[n][i]=a[n][i];    for (i=n-1;i>=1;i--)     for (j=1;j<=i;j++)    if (a[i][j]+f[i+1][j]>a[i][j]+f[i+1][j+1]) f[i][j]=a[i][j]+f[i+1][j];    else f[i][j]=a[i][j]+f[i+1][j+1];    printf("%d\n",f[1][1]);    return (0);}
//顺推法#include <iostream>#include <cstdio>int f[1001][1001],a[1001][1001],n,i,j;int main(){    scanf("%d",&n);    for (i=1;i<=n;i++)     for (j=1;j<=i;j++)      scanf("%d",&a[i][j]);    f[1][1]=a[1][1];    for (i=2;i<=n;i++)        for (j=1;j<=i;j++)            if (a[i][j]+f[i-1][j]>a[i][j]+f[i-1][j-1]) f[i][j]=a[i][j]+f[i-1][j];                else f[i][j]=a[i][j]+f[i-+1][j-+1];    j=0;    for (i=1;i<=n;i++)        if (j<f[n][i]) j=f[n][i];    printf("%d\n",j);    return (0);}
0 0
原创粉丝点击