传纸条(共四题) 动态规划 广度搜索 求最大路径 回溯法

本文介绍了四道关于传纸条的问题,涉及到动态规划、广度优先搜索和回溯法的运用。第一题通过动态规划解决,第二题引入广度优先搜索,第三题优化算法以适应1000规模的数据,第四题要求输出路径,采用回溯法实现。文章还分享了代码实现和一些算法优化技巧。
摘要由CSDN通过智能技术生成

这次题目有点多(共有四题),还是逐步变恶心的,我的变量和算法描述可能设置的不规范,请多见谅,还有,请问各位有什么绘制图表的软件吗,有的话劳烦大佬评论一下,word做图表太慢了,不然好多算法我能用图例说明了。
下面是题目要求时限
时间限制: 1600 ms
内存限制: 64 MB
代码长度限制: 16 KB

题目(1)

在这里插入图片描述

分析

1.动态规划 传到每一个同学的加权和,与其上方和其左边同学的加权和大小有关。
2.广度优先搜索 这题有点类似走迷宫的题目,通过用广度优先搜索,将 (行数+列数)相等的值可以算出来(但是这题过于简单,逐行遍历和逐列遍历也可以算出来)

代码

#include <iostream>
using namespace std;
int main()
{
    int impression[100][100];//impression用来储存好感度
    int group_num, row, col;//group_num用来储存组数,row用来储存行数,col用来储存列数
    cin >> group_num;
    while(group_num--)
    {
        cin >> row;
        cin >> col;
        for(int tmp = 0; tmp < row; tmp++)//通过两次循环输入好感度表
            for(int tmp2 = 0; tmp2 < col; tmp2++)
                cin >> impression[tmp][tmp2];
        for(int tmp = 2; tmp < row; tmp++)//在col为1和row为1的路径上走的时候,只有一条路径
            impression[0][tmp] += impression[0][tmp-1];
        for(int tmp = 2; tmp < col; tmp++)
            impression[tmp][0] += impression[tmp-1][0];
        //除了那两条特殊路径之外,其余的(如row为n,col为m)只能从上方(row为n-1,col为m)和左边(row为n,col为m-1)走到
        for(int tmp = 1; tmp < row; tmp++)
            for(int tmp2 = 1; tmp2 < col; tmp2++)
            {
                if(impression[tmp - 1][tmp2] > impression[tmp][tmp2 - 1])//找到上方和左边较大的值,然后与好感度表中(m,n)相连
                    impression[tmp][tmp2] += impression[tmp - 1][tmp2];
                else
                    impression[tmp][tmp2] += impression[tmp][tmp2 - 1];
            }
        cout << 2*impression[row-1][col-1] <<endl;//找出路径然后乘2
    }
    return 0;
}
备注:

后面的算法和这个最简单的思路完全不同,如果看后面的题目,请忽略掉以上代码,以免造成误解。但是,那两条特殊边一定要切记,后面题目中特例就有讨论这两条边。

题目(2)

在这里插入图片描述(这题目与上题目不同的地方在于 每个同学至多只能传一次纸条)

分析

刚刚那种算法就行不通了,但是这里我们可以看成两条纸条同时一起走,一条从(1,2)走到(n-1,m),另一条走到(2,1)走到(n,m-1),只要注意两个的row值不相等,一共走(m+n-3)步的时候,将两个加权步数的总和相加就能得到答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值