首页 > 其他分享 >12.21考试总结

12.21考试总结

时间:2024-12-28 22:10:08浏览次数:5  
标签:总结 int 12.21 cin long maxn 考试 dp define

分数

题号 T1 T2 T3 T4 T5 T6 T7 总分
分数 100 100 100 20 100 100 64 584

分析

T1

模板,讲烂了

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e6+5,mod=1e9+7,inf=1e18;
int n,a[maxn],dp[maxn];
signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int maxi=-inf;
	for(int i=1;i<=n;i++){
		dp[i]=1;
		for(int j=1;j<i;j++){
			if(a[j]<a[i]){
				dp[i]=max(dp[i],dp[j]+1);
			}
		}
		maxi=max(maxi,dp[i]);
	}
	cout<<maxi<<endl;
	return 0;
}

T2

二维DP模板,也讲烂了

Tip:注意行列为偶数时不能走

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e3+5,mod=1e9+7,inf=1e18;
int n,m,dp[maxn][maxn];
signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	dp[1][1]=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(i==1&&j==1)continue;
			if(i%2==0&&j%2==0)continue;
			dp[i][j]=dp[i-1][j]+dp[i][j-1];
		} 
	} 
	cout<<dp[n][m]<<endl;
	return 0;
}

T3

有\(10^{-9}\)点意思。

  1. 定义状态:\(dp_i\)表示恰好得到\(i\)个字的最少操作次数
  2. 答案:\(dp_n\)
  3. 状态转移方程:
    ①:从\(i-1\)转移过来:\(dp_{i-1}+1\)
    ②:当\(i\)为偶数时,从\(\frac{i}{2}\)转移过来:\(dp_{\frac{i}{2}}+1\)
    答案即:
    (1)\(i\mod 2=1\),\(dp_i=dp_{i-1}+1\)
    (2)\(i\mod 2=0\),\(dp_i=\min(dp_{i-1}+1,dp_{\frac{i}{2}}+1)\)
  4. 边界:\(dp_1=1\)
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e6+5,mod=1e9+7,inf=1e18;
int n,dp[maxn]; 
signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	memset(dp,0x3f,sizeof(dp));
	dp[1]=0;
	for(int i=2;i<=n;i++){
		dp[i]=min(dp[i],dp[i-1]+1);
		if(i%2==0){
			dp[i]=min(dp[i],dp[i/2]+1); 
		} 
	} 
	cout<<dp[n]<<endl;
	return 0;
}

T4

典例题,只不过将01背包的模板\(c\)数组改为打赢一个值,打输一个值而已
注意:这里由于前面的与后面的有关,所以不能改成一个一维数组的优化(喜提20分……)

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e3+5,mod=1e9+7,inf=1e18;
int n,m,win[maxn],lose[maxn],use[maxn],dp[maxn][maxn];
signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>lose[i]>>win[i]>>use[i];
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<=m;j++){
			if(j>=use[i]){
				dp[i][j]=max(dp[i-1][j]+lose[i],dp[i-1][j-use[i]]+win[i]);
			}
			else{
				dp[i][j]=dp[i-1][j]+lose[i];
			}
		}
	}
	cout<<dp[n][m]*5<<endl;
	return 0;
}

T5

这里我用记搜写的
定义\(dfs(pos,x)\)表示第\(x\)此传球在第\(pos\)个人手上
那么只要判断x=1时pos是否也等于1即可
注意,环形,所以1号左边是\(n\)号,\(n\)号右边是一号

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e3+5,mod=1e9+7,inf=1e18;
int n,m,dp[maxn][maxn],ans[maxn];
int gl(int x){
	if(x==1){
		return n;
	}
	return x-1;
}
int gr(int x){
	if(x==n){
		return 1;
	}
	return x+1;
}
int dfs(int pos,int x){
	if(x==1){
		if(pos==1){
			return 1;
		}
		return 0; 
	}
	if(dp[pos][x]!=-1){
		return dp[pos][x];
	} 
	int anss=dfs(gl(pos),x-1)+dfs(gr(pos),x-1);
	dp[pos][x]=anss;
	return anss;
}
signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	memset(dp,-1,sizeof(dp));
	cout<<dfs(1,m+1)<<endl;
	return 0;
}

T6

最大正方形的改版,只不过加一个维度表示右下角的数是1还是0
如果数是0,则答案需要:
左边的以1为右下角的满足条件的正方形边长与
上方的以1为右下角的满足条件的正方形边长与
左上角的以0为右下角的满足条件的正方形边长
作比较,取最小值

同理,如果数是1,则答案需要:
左边的以0为右下角的满足条件的正方形边长与
上方的以0为右下角的满足条件的正方形边长与
左上角的以1为右下角的满足条件的正方形边长
作比较,取最小值

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=2e3+5,mod=1e9+7,inf=1e18;
int n,m,a[maxn][maxn],dp[maxn][maxn][2];
signed main(){
//	freopen("test.in","r",stdin);
//	freopen("test.out","w",stdout);
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			char c;
			cin>>c;
			a[i][j]=c-'0';
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			dp[i][j][a[i][j]]=1;
		}
	}
	int maxi=-inf;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]==1){
				dp[i][j][1]=min(dp[i-1][j][0],min(dp[i][j-1][0],dp[i-1][j-1][1]))+1;
				maxi=max(maxi,dp[i][j][1]);
			}
			else{
				dp[i][j][0]=min(dp[i-1][j][1],min(dp[i][j-1][1],dp[i-1][j-1][0]))+1;
				maxi=max(maxi,dp[i][j][0]);
			}
		}
	}
	cout<<maxi<<endl;
	return 0;
}

T7

同样也是最大正方形的改版

可以发现,如果想要从一个正方形扩大,需要右下角为1,其余都为0,定义两个数组,分别表示一个位置左边0的个数与上方0的个数(包括自己)
则答案为:
左边的以0为的个数与
上方的以0的个数与
左上角的以1为右下角的满足条件的正方形边长
作比较,取最小值
坑点:
由于是对角线,所以左右两边的对角线都要考虑,右边同理

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=2e3+5e2+5,mod=1e9+7,inf=1e18;
int n,m,a[maxn][maxn],dp[maxn][maxn],pd[maxn][maxn][2],dp1[maxn][maxn];
signed main(){
//	freopen("test.in","r",stdin);
//	freopen("test.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			char c;
			cin>>c;
			a[i][j]=c-'0';
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]==1){
				dp[i][j]=1;
			}
		}
	}
//	cout<<"haha1";
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]==0){
				pd[i][j][0]=pd[i][j-1][0]+1;
				pd[i][j][1]=pd[i-1][j][1]+1;
			}
		}
	}
	int maxi=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]==1){
				dp1[i][j]=min(dp1[i-1][j-1],min(pd[i][j-1][0],pd[i-1][j][1]))+1;
				maxi=max(maxi,dp1[i][j]);
			}
		}
	}
//	cout<<"haha2"; 
	memset(pd,0,sizeof(pd));
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]==1){
				dp1[i][j]=1;
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=m;j>=1;j--){
			if(a[i][j]==0){
				pd[i][j][0]=pd[i][j+1][0]+1;
				pd[i][j][1]=pd[i-1][j][1]+1;
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]==1){
				dp1[i][j]=min(dp1[i-1][j+1],min(pd[i][j+1][0],pd[i-1][j][1]))+1;
				maxi=max(maxi,dp1[i][j]);
			}
		}
	}
	cout<<maxi;
	return 0;
}
/*
4 4
1 0 0 1
0 0 1 0
0 1 0 1
1 0 0 0
*/ 

标签:总结,int,12.21,cin,long,maxn,考试,dp,define
From: https://www.cnblogs.com/OIer-QAQ/p/18638034

相关文章

  • Blog-3 题目集7~8的总结
    22207203-陈思思一、前言(一)第7次题目集(家居强电电路模拟程序-3)知识点:串联电路:电流相同,电压分配。并联电路:电压相同,电流分配。类的设计:电路设备类、受控设备类、控制设备类、串联电路类、并联电路类。数据结构:使用列表或字典存储电路信息、设备状态。算法:递归或迭代计算电......
  • 软工总结
    学期回顾我对于软件工程课程的想象在我接触软件工程课程前,我觉得它不仅是学编程、写代码,更像是一次“搭建梦想”的旅程。我时常会想象自己开发软件应用的场景:是埋头苦敲代码,还是与组员激情讨论。亦或当我真正使用到自己参与开发的软件时,是激动多一些还是感动多一些,这些想法时常......
  • 题目集7~8总结性博客
    前言在本学期的学习过程中,我们共完成了三次题目集的练习,其中第七题和第八题集在知识点、题量和难度上具有一定的代表性。总体而言,这两次题目集涵盖了面向对象编程(OOP)、设计模式、数据结构与算法、软件工程等多个核心知识点。知识点总结:面向对象编程(OOP):类的设计与继承、多态性......
  • 2024-2025-1 20241413 《计算机基础与程序设计》第十四周学习总结
    |班级链接|https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP||作业要求|https://www.cnblogs.com/rocedu/p/9577842.html#WEEK14|教材学习内容总结《c语言程序设计>第十三,十四章第13章:文件操作文件的概念:介绍文件的基本概念,包括文件的分类(文本文件和二进制文件)以及文......
  • 家居强电电路模拟程序总结
     一、前言:  这两次的PTA作业第一次是以前两次家居强电电路模拟程序为基础所扩展的,在上一次作业的基础上增加了一个新的互斥开关,互斥开关的电路符号为H,其12引脚之间电阻为5欧,13引脚之间电阻为10欧,还增加了一个新的受控窗帘,受控窗帘的电路符号为S,窗帘电阻为15欧,其最低工作电压为......
  • 第三次Blog--题目集7~8的总结
    一、前言1.前言的前言最近辛苦啦,谢谢你在繁忙的日子来到我的博客!马上就2025年了,祝你新年一切顺遂呀~~2.知识点面向对象编程需要创建多个类来表示不同的设备和电路类型,例如控制设备类(开关、调速器等)、受控设备类(灯、风扇、窗帘等)、串联电路类和并联电路类。每个类应该封装......
  • 【2024年终总结】从初入博客到出入博客
    2024年已经过去了,我自己其实回头看看有的时候挺感慨的,因为我做过的事情比较多,本身我做过央国企的员工(物流管理),后来跟随初创团队去外面打拼做互联网(程序员),又到后来回运营商(还是央国企)做方案(售前售后),再往后做到央企的销售管理(班子成员),始终没想到自己的路线有这么多变数,但是也正是因......
  • 题目集7~8的总结性Blog
    一、前言   相关知识点:   1、家居强电电路模拟程序-3在上一次的基础上增加了互斥开关,互斥开关只有两种状态:开关接往上面的2号引脚、接往下面的3号引脚。开关每次只能接通其中一个分支引脚,而另一个分支引脚处于断开状态。为避免短路,互斥开关设置了限流电阻,12引脚之间默......
  • 题目集7-8总结
    **题目集7**一、前言题目集7围绕智能家居强电电路模拟系统展开,主要涉及多种控制设备(如开关、分档调速器、连续调速器、互斥开关)和受控设备(如灯、风扇、窗帘)的模拟,以及对不同设备连接信息、调节信息的处理,并根据这些信息输出各设备的状态或参数。题量方面,涵盖了多种类型的输......
  • 学期(2024-2025-1) 学号(20241420) 《计算机基础与程序设计》第十四周学习总结
    学期(2024-2025-1)学号(20241420)《计算机基础与程序设计》第十四周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2024-2025-1计算机基础与程序设计第十四周作业)这个作业的目标<《C语......