Magical Subsequence
[link](Problem - B - Codeforces)
题意
给你一个序列,让你选择一个子序列,使得子序列中任意奇数项和后一个偶数项的和都相同,问你子序列最长为多少。
题解
对于前i个数来说它的选法是存在最优解的,因此考虑DP,设
f
[
i
,
j
]
:
从
前
i
个
数
里
选
且
两
两
相
加
和
为
j
的
最
长
子
序
列
的
长
度
f[i,j]:从前i个数里选且两两相加和为j的最长子序列的长度
f[i,j]:从前i个数里选且两两相加和为j的最长子序列的长度,考虑划分集合为第i个数选与不选,因此状态转移即
f
[
i
,
j
]
=
m
a
x
(
f
[
i
−
1
,
j
]
,
f
[
l
a
s
t
[
i
,
j
−
a
[
i
]
]
−
1
,
j
]
+
2
)
当
l
a
s
t
[
i
,
j
−
a
[
i
]
]
存
在
时
转
移
f[i,j]=max(f[i-1,j],f[last[i,j-a[i]]-1,j]+2){当last[i,j-a[i]]存在时转移}
f[i,j]=max(f[i−1,j],f[last[i,j−a[i]]−1,j]+2)当last[i,j−a[i]]存在时转移,
l
a
s
t
[
i
,
j
]
:
第
i
个
数
前
面
第
一
个
值
为
j
的
位
置
last[i,j]:第i个数前面第一个值为j的位置
last[i,j]:第i个数前面第一个值为j的位置。
Code
#include
#include
#include
#include
#include
#include
#include
#include