东华复试OJ二刷复盘12

进阶12:给定一个以秒为单位的时间t,要求用"<H>:<M>:<S>"的格式来表示这个时间。<H>表示时间,<M>表示分钟,而<S>表示秒,它们都是整数且没有前导的"0"。例如,若t=0,则应输出是"0:0:0";若t=3661,则输出"1:1:1"。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int main(){
	int n;cin>>n;
	int ansH=0,ansM=0,ansS=0;
	ansS = n;
	while(ansS>=60){
		ansS-=60;ansM+=1;
	}
	while(ansM>=60){
		ansM-=60;ansH+=1;
	}
	cout<<ansH<<':'<<ansM<<':'<<ansS<<endl;
	system("pause");
}

基础79:该阵列由n个正整数构成,阵列中的数字从1开始递增,数字的排序规则是从1开始由中间逆时针向外转出,2出现在1的下面,然后直至输出n为止。

例如当n=5的时候,阵列如下:

5

1 4

2 3

当n=9时,阵列如下:

7 6 5

8 1 4

9 2 3

当n=10时,阵列如下:

7 6 5

8 1 4

9 2 3

10

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int targetNum;
void PrintM(vector<vector<int>>&matrix,int di){
	for(int i=0;i<di;i++){
		for(int j=0;j<di;j++){
			cout<<matrix[i][j]<<' ';
		}
		cout<<endl;
	}
	cout<<endl;
}

void Create(vector<vector<int>>&matrix,int &indexR,int &idnexC,
	int di,int &num,int &loop){
	//cout<<loop<<"-------------------"<<endl;
	//下右上左
	int len=1;
	if(loop==1)len = loop;
	else{
		for(int i=0;i<loop-1;i++){
			len+=2;
		}
	}
	
	for(int i=0;i<len;i++){
		indexR++;num++;
		matrix[indexR][idnexC] = num;
		//PrintM(matrix,di);
		if(num==targetNum)return;
		
	}
	
	for(int i=0;i<len;i++){
		idnexC++;num++;
		matrix[indexR][idnexC] = num;
		//PrintM(matrix,di);
		if(num==targetNum)return;
	}
	
	//-----------
	len++;
	for(int i=0;i<len;i++){
		indexR--;num++;
		matrix[indexR][idnexC] = num;
		//PrintM(matrix,di);
		if(num==targetNum)return;
	}
	
	for(int i=0;i<len;i++){
		idnexC--;num++;
		matrix[indexR][idnexC] = num;
		//PrintM(matrix,di);
		if(num==targetNum)return;
	}
	
	loop++;
}

int main(){
	while(cin>>targetNum){
		int di=1;
		for(int i=2;;i++){
			if(i*i >= targetNum){
				di = i;break;
			}
		}
		vector<vector<int>> matrix(di,vector<int>(di,0));
		int indexR,idnexC;
		if(di%2==1){
			indexR=di/2;idnexC=di/2;
		}
		else {
			indexR=di/2-1;idnexC=di/2-1;
		}
		int num=1;
		matrix[indexR][idnexC] = 1;
		//下右上左
		int loop=1;
		while(num<targetNum){
			Create(matrix,indexR,idnexC,di,num,loop);
		}
		//输出方式
		//PrintM(matrix,di);
		//检查列,跳过整列为0的列
		int SkipCol=-1;
		for(int i=0;i<di;i++){
			int currentcolIsSkip=1;
			for(int j=0;j<di;j++){
				if(matrix[j][i]!=0)currentcolIsSkip=0;
			}
			if(currentcolIsSkip)SkipCol=i;
		}
		
		for(int i=0;i<di;i++){
			for(int j=0;j<di;j++){
				if(j!=SkipCol&&matrix[i][j] != 0)cout<<matrix[i][j];
				else if(j==SkipCol)continue;
				else cout<<' ';
                if(matrix[i][j] != targetNum)cout<<' ';
				
			}
			cout<<endl;
		}
		
	}
	system("pause");
}
  • 做了很久,不熟。多次尝试和画图后发现向下和右的位数分别为1、3、5,而上和左为2、4次。

题72:考虑在下面被显示的数字金字塔(第n行有n列)。写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。每前进一步可以走到它的正下方或者右下方(往下一行、往右一列)的位置。

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30

  • 动态规划思想:用一个多维数组记录该坐标含义下的最大值,比如无限背包中i个物品j个负重下的最大值,数字金字塔的是i行j列元素到达最底层的最大值。
  • 函数形式:
    • 辅助数组 dp
    • 值类型 DP(参数){
    • if(边界条件) 边界的返回值;
    • if(辅助数组dp已有值可直接返回)
    • 分支进入语句,return 记录值 = 所有分支中最大的一个}
  • 使用DP函数时,为最初始的状态值。
cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

vector<vector<int>> dp;
vector<vector<int>> matrix;

int DPfunc(int row,int col,int edge){
	if(row == edge) return matrix[row][col];
	if(dp[row][col] !=-1)return dp[row][col];
	dp[row][col] = matrix[row][col] + 
	max(DPfunc(row+1,col,edge),DPfunc(row+1,col+1,edge));
	return dp[row][col];
}

int main(){
	int di;cin>>di;
	matrix = vector<vector<int>> (di,vector<int>(di,0));
	dp = vector<vector<int>> (di,vector<int>(di,-1));
	for(int i=0;i<di;i++){
		for(int j=0;j<i+1;j++){
			cin>>matrix[i][j];
		}
	}
	//------------
	int ans = DPfunc(0,0,di-1);
	cout<<ans<<endl;
	system("pause");
}

题76:给你一张5行5列的效益表,表中的数字均为大于等于0的整数,要求在这张表中选出5个不同行不同列的数字,使这5个数字的和最大。

  • 类似于八皇后的DFS问题。与动态规划很像却又不同,首先它不需要辅助数组和return记录当前分支路口中最大的值,它直接传递每个分支的值,在边界处进行比较和更新即可。
  • 函数形式:
    • void DFS(int sum,参数){
    • if(边界或越界后处理)ans =max(ans,sum); return;
    • 进入分支语句
      • new参数,DFS(sum+本分支的值,new参数)
    • return;}
  • 注意要new参数,否则修改的是本层参数,后续分支用不了该分支对应参数。

Reinforcement learning is a machine learning approach that learns optimal strategies through interaction with the environment. In the reinforcement learning framework, an agent observes the state of the environment and takes corresponding actions in order to receive rewards or penalties. The goal of the agent is to find a policy that maximizes long-term cumulative rewards through continuous exploration and learning. Unlike supervised learning, reinforcement learning usually does not rely on large amounts of labeled data but improves decision-making ability through trial and error. Reinforcement learning has achieved success in many complex tasks such as robotic control, autonomous driving, and game artificial intelligence. In the famous Go program AlphaGo, reinforcement learning was combined with deep neural networks, enabling computers to reach or even surpass the level of top human players. However, in practical applications, reinforcement learning still faces challenges such as low sample efficiency and high training costs.

  • 强化学习是通过和环境互动来学习最优策略的机器学习方法。在强化学习框架中,智能体观察环境的状态并采取相关的行动来获得强力或惩罚。智能体的目标是通过持续的探索和学习来找到一个策略能够最大化长期的累积奖励。不同于监督学习,强化学习通常不依赖于大量的带标签的数据,而是通过试验和错误来提高决策能力。强化学习已经在许多的复杂任务中取得了成功,例如机器人控制、自动驾驶和游戏人工智能。在最著名的Go程序AlphaGo中,强化学习结合深度神经网络,使得计算机达到了甚至超越了顶尖人类选手的水平。然而,在实际应用中,强化学习仍然面临挑战,例如低样本效率和高额训练开销。
相关推荐
一隅论数智10 小时前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
XiHongShi201610 小时前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
爱吃苹果的日记本11 小时前
离散数学第六课
学习·离散数学
AI职业加油站12 小时前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
旖旎夜光12 小时前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
奇思妙想聪明勤奋的小羊13 小时前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
霍霍的袁13 小时前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
彧azz13 小时前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
我爱cope14 小时前
【操作系统 | 计算机硬件:CPU、内存与 I/O 如何支撑操作系统?】
学习·操作系统