社区讨论

警示后人(如果你wa on #13)

P3146[USACO16OPEN] 248 G参与者 9已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@mhjtoh4d
此快照首次捕获于
2025/11/04 08:20
4 个月前
此快照最后确认于
2025/11/04 08:20
4 个月前
查看原帖
存在这样一种问题卡掉了你的程序,如果原序列的所有相邻的数都不相等,那么其两两永远不可能合并,此时你应该输出原序列的最大值比如这样写:
CPP
for(int i=1;i<=n;i++){
		cin>>a[i];
		ans=max(ans,a[i]);
	}
然后你会发现这样写依旧没有AC,详细看错误信息会提示你read 5 expected 4。
这说明还存在这样的问题,没有初始化dp数组导致你进行dp时,区间长度为2时dp数组是永远无法更新的,因为两两不相等,但区间更长时,你的dp数组正在悄悄更新,因为其初始值都是0,两两相等,所以就更新了,给出了错误的结果5。
解决方案有两种,个人倾向写第一种:
  1. 给你的dp数组赋值为负无穷,代表着小区间不合并就无法在大区间合并。
CPP
memset(f,-0x3f,sizeof(f));
  1. 转移时判断一下其值是否为0
CPP
	if(f[l][k]==f[k+1][r] && f[l][k]){
					f[l][r]=max(f[l][r],f[l][k]+1);
					ans=max(f[l][r],ans);
				}
然后再交就可以AC力!!

回复

8 条回复,欢迎继续交流。

正在加载回复...