• 数塔问题(递归/递推)


    递归写法 从上往下
    在这里插入图片描述

    #include<iostream>
    #include<vector>
    #include<queue>
    #include<stack>
    #include<string>
    #include<math.h>
    #include<algorithm>
    #include<map>
    #include<cstring>
    #include<set>
    using namespace std;
    const int maxn = 1100;
    int f[maxn][maxn], dp[maxn][maxn];
    int n;
    
    int getans(int i, int j)
    {
    	if (dp[i][j] != 0)
    		return dp[i][j];
    	if (i == n)
    		return f[i][j];
    	
    	dp[i][j] = max(getans(i+1,j), getans(i+1,j+1)) + f[i][j];
    
    	return dp[i][j];
    }
    int main()
    {
    	
    	cin >> n;
    	for (int i = 1; i <= n; i++)
    	{
    		for (int j = 1; j <= i; j++)
    		{
    			cin >> f[i][j];
    		}
    	}
    	cout << getans(1, 1);
    }
    
    

    递推写法 从下往上

    #include<iostream>
    #include<vector>
    #include<queue>
    #include<stack>
    #include<string>
    #include<math.h>
    #include<algorithm>
    #include<map>
    #include<cstring>
    #include<set>
    using namespace std;
    const int maxn = 1100;
    int f[maxn][maxn], dp[maxn][maxn];
    int n;
    
    int main()
    {
    	cin >> n;
    	for (int i = 1; i <= n; i++)
    	{
    		for (int j = 1; j <= i; j++)
    		{
    			cin >> f[i][j];
    		}
    	}
    	for (int j = 1; j <= n; j++)
    	{
    		dp[n][j] = f[n][j];
    	}
    	for (int i = n - 1; i >= 1; i--)
    	{
    		for (int j = 1; j <= i; j++)
    		{
    			dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + f[i][j];
    		}
    	}
    	cout << dp[i][j] << endl;
    	return 0;
    }
    
  • 相关阅读:
    面试干货——年底干货大放送,你准备好了吗?(转)
    JavaScript学习 三、变量、作用域和内存
    JavaScript学习 二、基础
    JavaScript学习 一、简介
    从统计看机器学习常见算法
    [zz]unity 性能优化
    游戏统计指标
    [zz]sql优化相关
    [zz]sql语句执行顺序
    unity 链接
  • 原文地址:https://www.cnblogs.com/Hsiung123/p/13811991.html
Copyright © 2020-2023  润新知