当前位置: 首页 > news >正文

2025年大一训练-DP1

2025年大一训练-DP1

  • Problem A:在这里插入图片描述

动态规划算法,从上往下一层层找到到达对应位置的最大值,最底下一行maxl的最大值即为答案

#include<bits/stdc++.h>
using namespace std;
int lst[101][101];
int maxl[101][101];int main()
{int n,i,j;while(cin>>n){memset(lst,0,sizeof(lst));memset(maxl,0,sizeof(maxl));for(i=1;i<=n;i++){for(j=1;j<=i;j++){cin>>lst[i][j];if(i==1) maxl[i][j]=lst[i][j];else{maxl[i][j]=lst[i][j]+max(maxl[i-1][j],maxl[i-1][j-1]);}}}int maxn=0;for(j=1;j<=n;j++){if(maxl[n][j]>maxn) maxn=maxl[n][j];}cout<<maxn<<endl;}return 0;
}
  • Problem B:
    在这里插入图片描述

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
const int maxn = 20;
int dp[maxn][maxn];int main()
{int n,i,j;for(i=0;i<maxn;i++){dp[0][i]=1;dp[i][0]=1;}for(i=1;i<maxn;i++){for(j=1;j<maxn;j++){dp[i][j]=dp[i][j-1]+dp[i-1][j];}}while(scanf("%d",&n)!=EOF&&n!=0){cout<<dp[n][n]<<endl;}return 0;
}
  • Problem C:
    在这里插入图片描述

肯定不能每输入一次就递归,一定有测试点过不去,所以预处理202020的结果数组,然后输入查表就行了

#include<bits/stdc++.h>
using namespace std;
int f[25][25][25];
void w(int a, int b, int c)
{if (a==0 || b==0 || c==0) f[a][b][c] = 1;else if(a<b && b<c){f[a][b][c]=f[a][b][c-1]+f[a][b-1][c-1]-f[a][b-1][c];}else{f[a][b][c]=f[a-1][b][c]+f[a-1][b-1][c]+f[a-1][b][c-1]-f[a-1][b-1][c-1];}}int main()
{int a,b,c;int i,j,k;for (i=0;i<21;i++){for (j=0;j<21;j++){for (k=0;k<21;k++){w(i,j,k);}}}while (cin>>a>>b>>c){if (a==-1 && b==-1 && c==-1){break;}if (a<=0 || b<=0 || c<=0){cout<<"w("<<a<<", "<<b<<", "<<c<<") = "<<1<<endl;}else if (a>20 || b>20 || c>20){cout<<"w("<<a<<", "<<b<<", "<<c<<") = "<<f[20][20][20]<<endl;}else{cout<<"w("<<a<<", "<<b<<", "<<c<<") = "<<f[a][b][c]<<endl;}}return 0;
}
  • Problem D:
    在这里插入图片描述

和前一题类似,需要预处理数组,但判断条件“and not already in the sequence”就需要用hash表去重了

#include<bits/stdc++.h>
using namespace std;
int a[500005]={0};
bool hash[100000000]={false};int main()
{int i,n;for(i=1;i<=500000;i++){if(a[i-1]-i>0 && !hash[a[i-1]-i]) a[i]=a[i-1]-i;else a[i]=a[i-1]+i;hash[a[i]]=true;}while(cin>>n && n!=-1) cout<<a[n]<<endl;return 0;
}

但是题目内存受限,hash占用内存过大,可以用std::set(std::unordered_set更好),但是hash在一些版本里关键字冲突了,不建议用这个作为变量名(不然就会像我一样Compile Error四次才发现)

#include<bits/stdc++.h>
using namespace std;
int a[500001] = {0};
set<int> hashlst;int main()
{int i,n;for (i=1;i<=500000;i++){if (a[i-1]-i>0 && hashlst.find(a[i-1]-i)==hashlst.end()) a[i]=a[i-1]-i;else a[i]=a[i-1]+i;hashlst.insert(a[i]);}while (cin>>n && n!=-1) cout<<a[n]<<endl;return 0;
}
  • Problem E:
    在这里插入图片描述

在这里插入图片描述
下面是我为人人的具体代码实现

#include<bits/stdc++.h> 
using namespace std;
typedef struct
{int a;int x,y;
}Node;
Node node[10010];
int n,m;
int lst[110][110];
int len[110][110];
int dirx[4] = {1,0,-1,0};
int diry[4] = {0,1,0,-1};
bool cmp(const Node& n,const Node& m)
{return n.a<m.a;
}int main()
{cin>>n>>m;int p=0,i,j;for(i=1;i<=n;++i){for(j=1;j<=m;++j){cin>>lst[i][j];len[i][j]=0;node[p].a=lst[i][j];node[p].x=i;node[p++].y=j;}}sort(node,node+p,cmp);for(i=0;i<p;i++){int l=1;for(j=0;j<4;j++){int dx = node[i].x+dirx[j];int dy = node[i].y+diry[j];if(dx>0 && dy>0 && dx<=n && dy<=m && lst[dx][dy]<node[i].a)l=max(l,len[dx][dy]+1);}len[node[i].x][node[i].y]=max(l,len[node[i].x][node[i].y]);}int Max=-1;for(i=1;i<=n;i++){for(j=1;j<=m;j++)Max=max(Max,len[i][j]);}cout<<Max<<endl;return 0;
}

相关文章:

  • WebSocket:实现实时双向通信的技术
  • 网络安全-Burp Suite基础篇
  • 手持式三维扫描设备赋能智能汽车制造
  • 第五章 SQLite数据库:5、SQLite 进阶用法:JOIN、UNION、TRIGGER、INDEX、ALIAS、INDEXED BY 等模块
  • 大屏设计与汇报:政务服务可视化实践
  • RUI桌面TV版最新版免费下载-安卓电视版使用教程
  • 2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(二级)真题
  • LIB-ZC, 一个跨平台(Linux)平台通用C/C++扩展库, stream 流操作
  • Windows 11设置开机自动运行 .jar 文件
  • orcad csi 17.4 DRC规则设置及检查
  • 生成器模式深入解析与 Spring 源码应用
  • 新书速览|DeepSeek移动端AI应用开发:基于Android与iOS
  • AI数字人如何深度赋能政务场景?魔珐科技政务应用全景解读
  • 第十七届“华中杯”大学生数学建模挑战赛题目C题就业状态分析与预测完整 思路 代码 模型 结果 分享
  • Android守护进程——Vold (Volume Daemon)
  • C# 检查字符串是否包含在另一个字符串中
  • 集合框架--Set集合详解
  • rocketMQ 常见问题记录
  • 使用最新threejs复刻经典贪吃蛇游戏的3D版,附完整源码
  • [Java · 初窥门径] Java 语言初识
  • 平安资管总经理罗水权因个人工作原因辞职
  • 两部门调度部署“五一”假期安全防范工作,要求抓好旅游安全
  • 山西太原小区爆炸事故已造成17人受伤
  • 国家卫健委有关负责人就白皮书发布答记者问
  • “五一”假期逛上海车展请提前购票,展会现场不售当日票
  • 锦江酒店:第一季度营业收入约29.42亿元,境内酒店出租率同比增长