The universe |

Momo·Trace

园龄:3年3个月粉丝:6关注:1

可回退的数字三角形

注:此题为“数字三角形”的升级版,详见https://www.cnblogs.com/momotrace/p/p1216.html

题目

如图所示,一个数字三角形。请编一个程序计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大。每一步可沿左斜线向下或右斜线向下走,同时还可以回退m次
image
1< 三角形行数< 25; m<=30 三角形中的数字为整数< 1000;

输入

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

输出

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

样例

样例输入1

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

样例输出1

30

Code

#include<bits/stdc++.h>
using namespace std;
int a[50][50],n,m,f[50][50][50],ans=-1;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cin>>a[i][j];
f[1][1][0]=a[1][1];
for(int k=0;k<=m;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
if(k==0)f[i][j][k]=max(f[i-1][j][k],f[i-1][j-1][k])+a[i][j];
if(k>0) f[i][j][k]=max(f[i+1][j+1][k-1],max(f[i+1][j][k-1],max(f[i-1][j][k],f[i-1][j-1][k])))+a[i][j];
ans=max(ans,f[i][j][k]);
}
}
}
cout<<ans;
return 0;
}
posted @   Momo·Trace  阅读(27)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起