这次题目有点多(共有四题),还是逐步变恶心的,我的变量和算法描述可能设置的不规范,请多见谅,还有,请问各位有什么绘制图表的软件吗,有的话劳烦大佬评论一下,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)步的时候,将两个加权步数的总和相加就能得到答案。