0713 总结

题目

问题分析

T1

一道黄题。水题\color{white}{水题}

第一眼就是一个一维 DP,再推一下式子可以发现这道题数组都不用开,几个变量就解决了,最终耗时10min。

100pts100pts

T2

在考场上先看的数据范围,发现是 1n501\le n\le 50,就开始思考 O(n4)O(n^4) 的做法,然后就先表示了一个 DP 数组 dp[i][j]dp[i][j] 表示 [i,j][i,j] 区间内的最少涂色次数,然后思考状态转移。

随后我发现了一种状态转移的方法,在 s[i]==s[j]s[i] == s[j] 的情况下,可以在左右两边找到最长的 s[i]s[i],然后将 dp[i][j]dp[i][j]dp[p1][p2]dp[p1][p2] 更新。这种做法是 O(n3)O(n^3) 的。

代码长这样:

1
2
3
4
5
6
7
8
if(s[i]==s[j]){
int p1=i+1,p2=j-1;
while(p1<=j&&p2>=i&&(s[p1]==s[p1-1]||s[p2]==s[p2+1])){
if(s[p1]==s[p1-1]) p1++;
if(s[p2]==s[p2+1]) p2--;
}
dp[i][j]=dp[p1][p2]+1;
}

但是考场上并没有举出反例证明这是错的,其实反例非常好构造 AAQWQAACBCAA 就是一个,这是没有考虑 AA***AA***AA 的贡献造成的。

实际上这样推就行:

1
dp[i][j]=min(dp[i+1][j],dp[i][j-1]);

O(n2)O(n^2)

以后一定要多模几组样例。

100pts>70pts(洛谷)/40pts(本地)100pts->70pts(洛谷)/40pts(本地)

T3

因为是 DP 专练,所以肯定不打 DP 啊必然是想着怎样 DP 的。

模拟了一下二维 DP,发现式子十分好推,只不过转移时代码又臭又长,只能作罢。

接着打了一个 DFS,发现 DFS 下来非常好写,于是观察了一下时间复杂度,发现要炸,赶紧想怎么优化。

发现 BFS 的板子跟 DFS 差不多,于是打了一个 BFS,再进行了一下优化,算了一下时间复杂度和常数,发现是 O(能过)O(能过),于是开开心心交上去了,其实算一算空间复杂度就知道要炸,而且本来的代码是能过的,但是我竟然把数组开小了!!!

就是挺智障的一个错,本来能得 60pts60pts 的现在只能得 40pts40pts 了。

100pts(预期)>60pts(实际)>40pts(脑瘫)100pts(预期)->60pts(实际)->40pts(脑瘫)

T4

考场上其实是想好了怎么递推的,递推式其实也非常好想,然后再写出来就会发现其实是一道斜率优化板子题。

但是观察数据范围可以发现 2n200002 \le n \le 20000,感觉 O(n2)O(n^2) 也可以过,于是就将循环展开了 1616 次,因为 log220000\log_2 20000 其实也就 1515 的样子。

果然,展开了以后进行一下模拟,发现极限数据也就 200ms200ms 左右的样子,最后交上去经过最终的重测时间也就是斜率优化的 22 倍左右,成功节省下来了不知道干什么用的时间。

100pts100pts

总结

这次考试我有很多地方就是有很多脑瘫的错误,最后检查代码是也没有检查出来,本来预计大概可以 AK 的,最终也只拿了 280pts(rank 3rd)280pts(rank\ 3^{rd}),有点可惜。

再次审视了我考场上的注释,发现我绝大部分的错误原因都在考场上想到了,但为什么我没改出来啊!!!!

教训就是除了要分析时间复杂度还要分析空间复杂度,还有就是要对自己的递推式再三审视,考虑所有情况,检查是也要仔细一点,不要再像某些 T3 一样把数组开小了。总而言之,菜就多练\color{white}{总而言之,菜就多练}


0713 总结
https://www.lzj-blog.top/2024/07/13/0713 总结/
作者
lzj
发布于
2024年7月13日
许可协议