可回退的数字三角形
注:此题为“数字三角形”的升级版,详见https://www.cnblogs.com/momotrace/p/p1216.html
题目
如图所示,一个数字三角形。请编一个程序计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大。每一步可沿左斜线向下或右斜线向下走,同时还可以回退m次
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;
}
本文来自小默的博客,转载请注明原文链接:https://www.cnblogs.com/momotrace/p/retroactive-p1216.html