CSP-S模拟记

编程竞赛反思:读题失误与区间DP解析
博主分享了一次编程竞赛的经历,由于误读题目导致严重失误,尤其是将T1读成判断子串。在T3题中,博主应用区间动态规划解决01背包问题,通过合并与删除操作,最终实现解决方案。文章强调了正确理解题目和细心调试的重要性。

目录

保持微笑:这次的总结很厚

题解

T1

T3


保持微笑:这次的总结很厚

三小时三道题

不幸的,只因在人群中看了T3一眼,上头了

草草看过T1T2,觉得T3最容易下手(??)

以至于连T1的题目都没理解

无论如何,打T3的代码,特判加起点终点加状态规划

#define ri register int	
for(ri len=1; len<n; len--)
		for(ri st=2; st+len-1<=n-1; st++) {
			ri en=st+len-1;
			for(ri k=st+1; k<en; k++)
				f[st][en]=max(f[st][en],f[st][k]+f[k+1][en]+s[k]); }

自信表示:样例没过,debug

de出来的是之前写的合并石子,两道题一起,思路炸了

+50min 浅放一下T3

+20min 读T2,练习过,默代码,过样例,结束

这时第三个槽点出现了

急着调T3,T1读成判断子串,我:开不了开不了

+70min 乱码一样的思路,T3连着改了几种算法,过不去

回看T1,终于发现读题似神游,读了个寂寞

之后:分析、分析不下去、分析、分析不下去

最后,雪崩

上头这破毛病第一次直接爆零,万万没想到还有第二次(?!)

题解

T1

简介 按规律写代码

什么判断子串,飞吧

只须注意输入换行,string2^31上下范围

#define ri register int
int T;
char ch[10000001];
int main() {
	scanf("%d\n",&T);
	for(ri j=1,i=0,flag=0; j<=T; j++,i=0,flag=0) {
		while(ch[++i]=getchar()) {
			if(ch[i]=='\n') break;
			if(ch[i]!='t'&&ch[i]!='l') flag=1;
			if(i!=1&&ch[i]=='l'&&ch[i-1]=='l') flag=1; }
		if(flag) printf("0 0\n");
		else if(ch[1]=='t') printf("0 1\n");
		else printf("1 1\n"); }
	return 0; }

T3

简介 区间dp

初见,针对01背包类似的动态规划,存在一个问题:如何实现合并后删除的操作

做减法不容易,但做加法可以,即用删除后的部分加上合并的部分

也就是区间dp

问题 输出错误 错加了s[k],和合并石子弄混了;时间 缺少ans的简化,三层for有重叠

#define ri register int
#define ll long long
int main() {
	memset(f,-0x3f3f3f3f,sizeof(f));
	scanf("%d%d",&n,&k);
	for(ri i=1; i<=n; i++) {
		scanf("%lld%lld",&a[i],&b[i]);
		if(a[i-1]+a[i]<=k&&i!=1) f[i-1][i]=b[i-1]+b[i]; }
	for(ri len=4; len<=n; len+=2)
		for(ri st=1; st+len-1<=n; st++) {
			ri en=st+len-1;
			if(a[st]+a[en]<=k) f[st][en]=max(f[st][en],f[st+1][en-1]+b[st]+b[en]);
			for(ri k=st+1; k<en-1; k+=2)
				f[st][en]=max(f[st][en],f[st][k]+f[k+1][en]); }
	for(ri i=2; i<=n; i++) {
		ans[i]=ans[i-1];
		for(ri j=i%2; j<i-1; j+=2) ans[i]=max(ans[i],ans[j]+f[j+1][i]); }
	printf("%lld",ans[n]);
	return 0; }
CSP-S考试中,进栈出栈问题考察的是对栈这种数据结构操作的理解和应用能力。解决这类问题,首先需要掌握栈的基本操作和特性,即后进先出(LIFO)原则。在面对一个序列的进栈和出栈操作时,可以通过模拟或分析操作序列来确定栈顶元素的状态。 参考资源链接:[CSP-S模拟试题与解析:进栈出栈规律与算法挑战](https://wenku.youkuaiyun.com/doc/42kmqw8xv8?spm=1055.2569.3001.10343) 例如,给定一个进栈序列,我们需要计算在特定操作次数后的栈顶元素。此时可以采取的方法是,根据序列中的出栈操作,模拟栈内元素的进出过程。每执行一次进栈操作,就将元素压入栈顶;每执行一次出栈操作,就移除栈顶元素。录每次操作后的栈顶状态,最终找到在特定操作次数后的栈顶元素。 参考《CSP-S模拟试题与解析:进栈出栈规律与算法挑战》中的例题解析,我们可以学习到如何根据题目给出的操作序列,逐步分析栈内元素的变化,从而准确计算出所需的结果。书中提供的解题步骤和解析不仅有助于理解进栈出栈操作的规律,还能够加深对数据结构的理解。 在实际解题过程中,还需要注意栈操作可能涉及的特殊情况,比如在给出的操作序列中,进栈和出栈的顺序可能导致某些操作无法进行(例如栈满时无法进栈,栈空时无法出栈)。因此,对于每一个操作,都需要验证其可行性,并严格按照栈的规则执行。 通过这样的模拟试题练习,不仅能够提高解决CSP-S考试中进栈出栈问题的能力,还能够加强对栈操作的理解,这对于提高编程和算法设计能力有着重要的意义。 参考资源链接:[CSP-S模拟试题与解析:进栈出栈规律与算法挑战](https://wenku.youkuaiyun.com/doc/42kmqw8xv8?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值