11.30考试总结
分数
T1 | T2 | T3 | T4 | T5 | T6 | T7 |
---|---|---|---|---|---|---|
100 | 100 | 100 | 100 | 100 | 0 | 50 |
T1 杨辉三角
每个
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e3+5;
int n,dp[maxn][maxn];
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
dp[i][1]=dp[i][i]=1;
}
for(int i=1;i<=n;i++){
for(int j=2;j<i;j++){
dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cout<<dp[i][j]<<' ';
}
cout<<endl;
}
return 0;
}
T2 [USACO11JAN] Profits S
最大字段和模板
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e6+5;
int n,a[maxn],dp[maxn];
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
memset(dp,0xe0,sizeof(dp));
dp[0]=0;
int maxi=-1e18;
for(int i=1;i<=n;i++){
dp[i]=max(dp[i-1]+a[i],a[i]);
maxi=max(maxi,dp[i]);
}
cout<<maxi;
return 0;
}
T3 [USACO1.5] [IOI1994]数字三角形 Number Triangles
如T1,每个
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e3+5;
int n,a[maxn][maxn],dp[maxn][maxn];
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}
memset(dp,-1,sizeof(dp));
dp[1][1]=a[1][1];
for(int i=2;i<=n;i++){
for(int j=1;j<=i;j++){
if(j==1){
dp[i][j]=dp[i-1][j]+a[i][j];
continue;
}
if(j==i){
dp[i][j]=dp[i-1][j-1]+a[i][j];
continue;
}
dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+a[i][j];
}
}
int maxi=-1e18;
for(int i=1;i<=n;i++){
maxi=max(maxi,dp[n][i]);
}
cout<<maxi;
return 0;
}
T4 [COCI2010-2011#7] ŠEĆER
考虑多重背包,多重背包板子
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=5e3+5;
int n;
int dp[maxn];
int w[maxn];
signed main(){
cin>>n;
w[1]=3;
w[2]=5;
memset(dp,0x3f,sizeof(dp));
dp[3]=dp[5]=1;
for(int i=1;i<=2;i++){
for(int j=w[i];j<=n;j++){
dp[j]=min(dp[j],dp[j-w[i]]+1);
}
}
if(dp[n]==dp[0]){
cout<<"-1"<<endl;
return 0;
}
cout<<dp[n];
return 0;
}
T5 友好城市
感觉是考试中唯二的有思考难度的题
首先,将南端城市按大小排序,只处理北端情况
北端与南段的航道要不相交,则南端友好城市必须持续不下降,发现就是求最长不下降子序列
加贪心优化,在DP刷题总结-2中已经叙述过
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e6+5;
int n;
struct Node{
int north,sorth;
}a[maxn];
int c[maxn],dp[maxn];
bool cmp(Node x,Node y){
return x.sorth<y.sorth;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].sorth>>a[i].north;
}
sort(a+1,a+n+1,cmp);
int maxi=-1e9;
memset(c,0x3f,sizeof(c));
for(int i=1;i<=n;i++){
int pos=lower_bound(c+1,c+i,a[i].north)-c;
// cout<<pos<<' ';
dp[i]=pos;
maxi=max(maxi,dp[i]);
c[pos]=a[i].north;
// cout<<dp[i]<<endl;
}
cout<<maxi<<endl;
return 0;
}
T6 闯关游戏
定义
那么只需枚举1-m,枚举上一个通过的通道即可
需要离开后才算分数,所以将上一个关卡的分数算进此关卡中
然后可能到达
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=4e4+5;
int n,m,dp[maxn],a[maxn],b[maxn];
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
memset(dp,0xefefef,sizeof(dp));
dp[1]=0;
for(int i=1;i<=n+n+n;i++){
for(int j=1;j<=m;j++){
if(i-a[j]>0){
dp[i]=max(dp[i],dp[i-a[j]]+b[i-a[j]]);
}
}
}
int maxi=-1e9;
for(int i=n+1;i<=n+n+n;i++){
maxi=max(maxi,dp[i]);
}
cout<<maxi;
return 0;
}
本人(KK_SpongeBob)蒟蒻,写不出好文章,但转载请注明原文链接:https://www.cnblogs.com/OIer-QAQ/p/18580264/11-30-test
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体