您的位置:首页 > 其它

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

2016-11-09 08:13 232 查看

数字三角形升级版

题目描述:

从数字三角形的顶部(如图,第一行的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: