可回退的数字三角形

注:此题为“数字三角形”的升级版,详见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 @ 2023-05-18 21:08  Momo·Trace  阅读(21)  评论(0编辑  收藏  举报