11.30考试总结

分数

T1 T2 T3 T4 T5 T6 T7
100 100 100 100 100 0 50

T1 杨辉三角

每个dp的状态是dpi1,j1dpi1,j的和

点击查看代码
#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,每个dp的状态是dpi1,j1dpi1,j的最大值在加上当前节点的分数

点击查看代码
#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 闯关游戏

定义dpi为到达关卡i时能获得的最大价值
那么只需枚举1-m,枚举上一个通过的通道即可
需要离开后才算分数,所以将上一个关卡的分数算进此关卡中
然后可能到达n以外的关卡,所以求答案时要枚举到n+n

点击查看代码
#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;
}

posted @   KK_SpongeBob  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体
点击右上角即可分享
微信分享提示