题目链接
记忆化搜索 (其实我不知道这个算不算DP)
题目分析
题目大意
给定n
个数和d1
和d2
,问这n
个数中存在多少个子区间,使子区间具有这样的性质:子区间内可以分为a
个和b
个数的序列,a
和b
均可为零,前a
个数为公差为d1
的等差序列,后b
个数为公差为d2
的等差数列。
解析
比赛的时候想法有点挫,统计出a
和b
的长度,然后强行算半天。
其实大可不必这样,直接记忆化搜索,比如有长度为l
的公差为d
的序列,那么第一个数只有一个次数1
,第二个数为2
,表示是它本身以及它和前一个数所形成的序列,同理,第三个数为3
,表示本身,他本身和前一个数,他本身和前两个数形成的3
种序列,最后,遍历每一个位置,只需要将在该点形成的两个公差相乘求和即可。
说的很晦涩,其实如果对于下标1, 2, 3, 4, 5
来讲,比如前三个数字符合公差为d1
的等差序列,后三个数符合公差为d2
的等差数列,那么记忆化搜索出来的两个数组即为1, 2, 3, 1, 1
和1, 1, 3, 2, 1
,第一位对应数字相乘表示1
,有一个,即为本身,第二位相乘表示2
,有两个,即本身和前一个,第三位相乘为9
,表示所有包含该点的情况,左边可以有三个数字,三种,右边有三个数字,三种,相乘即为3 * 3 = 9
。
比赛时的代码写的真的好挫。。。
代码
赛后代码
1 |
|
赛时代码
1 |
|