DP -入门题1

在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。 三角形的行数大于1小于等于100,数字为 0 - 99

 输入格式:

    5      //表示三角形的行数    接下来输入三角形

    7

    3   8

    8   1   0

    2   7   4   4

    4   5   2   6   5



DP解法1

#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 101

int buf[MAX][MAX];
int max_buf[MAX][MAX];


void solve(int pos_x,int pos_y,int &n)
{
    int i,j;
    for(i = n;i >= 1;i--)
    {
        if(i == pos_x)
        {
            j = pos_y;
            if(i == n)
            {
                max_buf[i][j] = buf[i][j];

            }
            else
            {
                int x,y;
                x = max_buf[i+1][j];
                y = max_buf[i+1][j+1];
                max_buf[i][j] = max(x,y) + buf[i][j];
            }
			cout <<max_buf[pos_x][pos_y];
        }
        else
        {
            for(j = 1;j <= i;j++)
            {
                if(i == n)
                {
                    max_buf[i][j] = buf[i][j];
                }
                else
                {
                    int x,y;
                    x = max_buf[i+1][j];
                    y = max_buf[i+1][j+1];
                    max_buf[i][j] = max(x,y) + buf[i][j];
                }
            }
        }
    }
	
}

int main()
{
    int i,j;
    int n;	
    cin >> n;
    for(i = 1;i <= n;i++)
    {
        for(j = 1;j <= i;j++)
        {
            cin >> buf[i][j];
        }
    }
    solve(1,1,n);
    system("pause");
    return 0;
}


#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 101

int buf[MAX][MAX];
int max_buf[MAX][MAX];
int max_buf_p[MAX];//优化的solve2所用


void solve(int pos_x,int pos_y,int &n)
{
    int i,j;
    for(i = n;i >= 1;i--)
    {
        if(i == pos_x)
        {
            j = pos_y;
            if(i == n)
            {
                max_buf[i][j] = buf[i][j];

            }
            else
            {
                int x,y;
                x = max_buf[i+1][j];
                y = max_buf[i+1][j+1];
                max_buf[i][j] = max(x,y) + buf[i][j];
            }
			cout <<max_buf[pos_x][pos_y];
        }
        else
        {
            for(j = 1;j <= i;j++)
            {
                if(i == n)
                {
                    max_buf[i][j] = buf[i][j];
                }
                else
                {
                    int x,y;
                    x = max_buf[i+1][j];
                    y = max_buf[i+1][j+1];
                    max_buf[i][j] = max(x,y) + buf[i][j];
                }
            }
        }
    }
	
}

//空间再优化
void solve2(int pos_x,int pos_y,int &n)
{
	int i,j;
	for(i = n;i >= 1;i--)
    {
        if(i == pos_x)
        {
            j = pos_y;
            if(i == n)
            {
                max_buf_p[j] = buf[i][j];

            }
            else
            {
                int x,y;
                x = max_buf_p[j];
                y = max_buf_p[j+1];
                max_buf_p[j] = max(x,y) + buf[i][j];
            }
			cout <<max_buf_p[pos_x];
        }
        else
        {
            for(j = 1;j <= i;j++)
            {
				if(i == n)
				{
					max_buf_p[j] = buf[i][j];
				}
				else
				{
					int x,y;
					x = max_buf_p[j];
					y = max_buf_p[j+1];
					max_buf_p[j] = max(x,y) + buf[i][j];
				}
				cout <<max_buf_p[pos_x];
            }
        }
    }

}
int main()
{
    int i,j;
    int n;	
    cin >> n;
    for(i = 1;i <= n;i++)
    {
        for(j = 1;j <= i;j++)
        {
            cin >> buf[i][j];
        }
    }
    solve2(1,1,n);
    system("pause");
    return 0;
}

CSP-J(入门组)和CSP-S(提高组)是中国计算机学会(CCF)组织的计算机软件能力认证考试,分别面向不同水平的参赛者,涉及算法和编程内容。这些考试自2019年起替代了原来的NOIP竞赛,成为重要的信息学奥赛评测标准之一。历年真和解析对于备考非常重要,有助于理解考试形式和提升编程能力。 对于CSP-J/S的历年真,可以通过以下方式获取: 1. **官方渠道**:CCF官网会发布部分真和参考答案,同时提供认证报名和相关通知。这是获取权威信息的首选方式。 2. **教育平台和社区**:一些教育平台或信息学竞赛社区(如洛谷、牛客网等)会整理历年真及解析,提供在线练习和讨论环境。 3. **书籍和备考资料**:市面上有专门针对CSP-J/S的辅导书籍,通常包含历年真、详细解析以及备考策略。 以下是部分CSP-J/S真的解思路示例,以帮助理解目类型和解答方式: ### CSP-J 真示例 以一道简单的编程为例,目要求计算两个整数的和: ```python # 示例输入 a, b = map(int, input().split()) # 输出结果 print(a + b) ``` 这类目通常出现在CSP-J的考试中,主要考察基础语法和简单逻辑能力。 ### CSP-S 真示例 CSP-S的目难度更高,例如涉及动态规划或图论问。以下是一个动态规划问的简化解法示例: ```python # 动态规划求解斐波那契数列 def fibonacci(n): if n <= 1: return n dp = [0] * (n + 1) dp[0] = 0 dp[1] = 1 for i in range(2, n + 1): dp[i] = dp[i - 1] + dp[i - 2] return dp[n] ``` 通过练习类似目,可以逐步掌握CSP-S的解技巧。 ### 考试准备建议 - **系统学习算法和编程基础**:掌握常用算法(如排序、搜索、动态规划)和数据结构(如数组、链表、树、图)。 - **模拟考试环境**:定期进行真模拟,提升代码编写速度和问解决能力。 - **参与讨论和交流**:加入信息学竞赛社区,与他人交流经验,共同进步。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值