程序设计思维与实践 Week12 作业

本文详细解析了三道算法竞赛题目,包括寻找众数、三维迷宫最短路径及最大子序列和问题。通过深入浅出的讲解,提供了解题思路与优化策略,适合算法学习者和竞赛选手参考。

A - 必做题 - 1
在这里插入图片描述解题思路

  • 因为最后答案唯一,只需要找到出现次数最多的数即可
  • 每次输入一个数a(不需要用数组!用一个变量即可),用数组cnt[a]统计a出现的次数,每次记录max(cnt)和对应的数,最后输出即可。

完整代码

#include<iostream>
#include<cstring>
using namespace std;
int a,cnt[1000000];
int main()
{
	
int n;
while(cin>>n)
{
memset(cnt,0,sizeof(cnt));
int Max=0;
int pos;
for(int i=0;i<n;i++)
	{cin>>a;
	cnt[a]++;
	if(cnt[a]>Max)
		Max=cnt[a],pos=a;
	}
cout<<pos<<endl;
}


}

B - 必做题 - 2
在这里插入图片描述
在这里插入图片描述解题思路

  • 用一个三维数组存储各个位置。
  • 从起始位置开始,bfs,每次向上下左右前后移动,长度+1即可。
  • 到达终点则return,记录长度;如果队列空了还没到,则无法到达。
  • 按要求输出即可。

完整代码

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
char a[31][31][31];
int leng,flag;
int si,sj,sk;//起始点 
int ei,ej,ek;//终点 
int L,R,C;
int reach[31][31][31];

struct nod
{
int x;
int y;
int z;
int len;
};

bool judge(int x,int y,int z)
{
if(x>=0&&x<L&&y>=0&&y<R&&z>=0&&z<C&&reach[x][y][z]==0&&a[x][y][z]!='#')
    {  return 1;
    }else return 0;

} 
queue<nod> q;

6void bfs()
{
	while(!q.empty())
		q.pop();
	nod m,mm,e;
	m.x=si,m.y=sj,m.z=sk,m.z=0;
	e.x=ei,e.y=ej,e.z=ek;
	q.push(m);
	while(!q.empty())
	{
	m=q.front();
	q.pop();
	if(m.x==e.x&&m.y==e.y&&m.z==e.z)
		{leng=m.len;flag=1;return;}
//	if(reach[m.x][m.y][m.z]==1||a[m.x][m.y][m.z]=='#')
//		continue;
	reach[m.x][m.y][m.z]=1;
	//cout<<m.x<<" "<<m.y<<" "<<m.z<<endl;
	
	if(judge(m.x+1,m.y,m.z))
	mm=m,mm.x++,mm.len++,q.push(mm);
	
	if(judge(m.x-1,m.y,m.z))
	mm=m,mm.x--,mm.len++,q.push(mm);
	
	if(judge(m.x,m.y-1,m.z))
	mm=m,mm.y--,mm.len++,q.push(mm);
	
	if(judge(m.x,m.y,m.z-1))
	mm=m,mm.z--,mm.len++,q.push(mm);
	
	if(judge(m.x,m.y+1,m.z))
	mm=m,mm.y++,mm.len++,q.push(mm);
	
	if(judge(m.x,m.y,m.z+1))
	mm=m,mm.z++,mm.len++,q.push(mm);
	}


		


}
int main()
{
std::ios::sync_with_stdio(false);
while(cin>>L>>R>>C)
{
	if(L==0&&R==0&&C==0)
		return 0;
	memset(a,0,sizeof(a));
	memset(reach,0,sizeof(reach));
	flag=0;
	for(int i=0;i<L;i++)
		for(int j=0;j<R;j++)
			for(int k=0;k<C;k++)
				{cin>>a[i][j][k]; 
				if(a[i][j][k]=='S')
					si=i,sj=j,sk=k;
				if(a[i][j][k]=='E')
					ei=i,ej=j,ek=k;
				}
	leng=0;
	bfs();
	if(flag==1)
		cout<<"Escaped in "<<leng<<" minute(s)."<<endl;
	else
		cout<<"Trapped!"<<endl;
}
/*
3 4 5
S....
.###.
.##..
###.#

#####
#####
##.##
##...

#####
#####
#.###
####E
*/
}

C - 必做题 - 3

在这里插入图片描述
解题思路

  • 令dp[i][j]表示 前l个数 取i段所能得到的最大的段之和,则对于dp[i][l],可以是将第l个数加入前一个段,也可以让他成为一个新的段;
  • 即dp[i][j]=max(dp[i][j-1]+a[j],dp[i-1][k]+a[j]),
  • 但数据量较大,要进行优化
  • 观察可以发现,dp[i-1][k]可以由上一次循环得到;当前状态dp[i][j]只与dp[i][j-]和max(dp[i-1][j])有关。每次记录max(dp[i-1][j]),即可转为一维

完整代码

#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int a[1000010],d[1000010],fm[1000010];
int main()
{
	std::ios::sync_with_stdio(false);
	int m,n;
	while(cin>>m>>n)
	{
		for(int i=1;i<=n;i++)
			cin>>a[i];
		int ans=0;
		d[0]=0;
		memset(fm,0,sizeof(fm));
		memset(d,0,sizeof(d)); 
		for(int i=1;i<=m;i++)
		{
			ans=-327690000;
			for(int j=i;j<=n;j++)
			{
				d[j]=max(d[j-1]+a[j],fm[j-1]+a[j]);
				fm[j-1]=ans;
				ans=max(ans,d[j]);
			}
		}
		cout<<ans<<endl;
	}
}

内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化训练,到执行分类及结果优化的完整流程,并介绍了精度评价通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置结果后处理环节,充分利用ENVI Modeler进行自动化建模参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
### 山东大学程序设计思维实践作业相关资料 #### 关于 Week7 的作业Week7 中,涉及的任务主要是关于状态转换问题。具体来说,给定初始状态和目标状态,需要通过一系列操作将其从初始状态转变为最终的目标状态。此过程需满足两个条件:一是所需的操作数应尽可能少;二是当存在多个最短路径时,优先选择字典序最小的那个作为输出[^1]。 输入数据通常由两部分组成: - 初始状态表示为字符串或其他形式的数据结构。 - 目标状态同样以类似的格式给出。 解决该类问题的核心在于构建有效的搜索算法,例如广度优先搜索 (BFS),并结合字典序比较逻辑来筛选最优解。 ```python from collections import deque def min_operations(initial, target): visited = set() queue = deque([(initial, "")]) while queue: current_state, path = queue.popleft() if current_state == target: return len(path), path if current_state not in visited: visited.add(current_state) # 假设定义了一些可能的状态转移函数 next_states for state in next_states(current_state): new_path = path + str(state) # 字符串拼接保持字典序记录 queue.append((state, new_path)) return -1, "" # 若无法到达则返回特殊值 ``` 上述代码片段展示了如何利用 BFS 来实现这一功能,并确保找到的是具有最小字典序的解决方案。 #### 关于 Week4 的作业 Week4 主要围绕二分查找的应用展开讨论。其中提到的关键点包括: - **参数范围设定的重要性**:如果设置得过小会增加不必要的迭代次数,进而提升整体的时间复杂度;而过大又可能导致精度不足,影响最终结果准确性[^2]。 - 特殊情况处理:某些情况下只需要一份复印件即可完成任务或者所有商店价格完全一致等问题都需要特别注意其边界条件。 - 使用二分法解决问题的具体流程描述如下: - 在预估的最大长度范围内执行二分查找; - 每次选取中间值判断能够分割成多少段符合条件的绳子; - 根据实际需求调整上下限直至达到指定误差标准为止。 时间复杂度方面,由于采用了经典的二分策略,因此总体效率较高,一般不会超过 O(log n)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值