数字三角形升级版(棋盘型动态规划)

来源:互联网 发布:淘宝在哪里改邮编 编辑:程序博客网 时间:2024/06/11 04:22

数字三角形升级版

题目描述:
从数字三角形的顶部(如图,第一行的5表示行数)到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,且你有一次机会可以把任何一个数重复加一遍。
和最大的路径称为最佳路径。你的任务就是求出最佳路径上的数字之和。
输入描述:
第一行:一个数,表示行数。
接下来n行为数塔
输出描述:
一个数即最优结果
样例输入:
5
1
1 3
1 1 3
1 1 1 3
7 1 1 1 3
样例输出:
18
数据范围及提示:
三角形行数不大于1000。最大和不大于maxlongint
思路:
加一维表示这条路径上是否已经取数,用0和1表示。

#include<iostream>#include<cstdio>using namespace std;const int maxn=1010;int n,a[maxn][maxn],f[maxn][maxn][2];int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++)      for(int j=1;j<=i;j++)      {        scanf("%d",&a[i][j]);        f[i][j][0]=a[i][j];        f[i][j][1]=a[i][j]<<1;      }    for(int i=n-1;i>=1;i--)      for(int j=1;j<=i;j++)      {        f[i][j][0]=a[i][j]+max(f[i+1][j][0],f[i+1][j+1][0]);        f[i][j][1]=a[i][j]+max(f[i+1][j][1],f[i+1][j+1][1]);        f[i][j][1]=max(f[i][j][1],f[i][j][0]+a[i][j]);      }      printf("%d",f[1][1][1]);      return 0;}
0 0
原创粉丝点击