20210906am
被各种不明错误弄得心态崩溃。
T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9 | T10 | |
---|---|---|---|---|---|---|---|---|---|---|
预测 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
一测 | 100 | 100 | 100 | 100 | 90 | 100 | 0 | 100 | 0 | 0 |
T1:
先拆环,再区间dp,
f
i
,
j
=
max
k
=
i
k
<
j
f
i
,
k
+
f
k
+
1
,
j
+
s
u
m
j
−
s
u
m
i
−
1
f_{i,j}=\max_{k=i}^{k<j}f_{i,k}+f_{k+1,j}+sum_j-sum_{i-1}
fi,j=maxk=ik<jfi,k+fk+1,j+sumj−sumi−1。复杂度
O
(
n
3
)
O(n^3)
O(n3)
T2:
01背包板子,特判和为奇数。
T3:
设计状态
f
i
f_i
fi表示时间到
i
i
i最多能占的时间,每个以
i
i
i结尾的活动都可以更新。设活动i开始为
s
i
s_i
si,结尾为
t
i
t_i
ti,长度为
l
e
n
i
=
t
i
−
s
i
+
1
len_i=t_i-s_i+1
leni=ti−si+1,则
f
i
=
max
t
[
j
]
=
i
(
f
s
[
j
]
+
l
e
n
j
,
f
i
−
1
)
f_i=\max_{t[j]=i}(f_{s[j]}+len_j,f_{i-1})
fi=maxt[j]=i(fs[j]+lenj,fi−1)。
T4:
一条过去一条回来可以看做两条过去,且一切有交叉的路径可以通过改变顺序变成不交叉的,设计状态
f
x
1
,
y
1
,
x
2
,
y
2
f_{x_1,y_1,x_2,y_2}
fx1,y1,x2,y2表示一人走到
(
x
1
,
y
1
)
(x_1,y_1)
(x1,y1),另一人走到
(
x
2
,
y
2
)
(x_2,y_2)
(x2,y2)的最大好感值,因为两人需一起移动,所以转移方程为
f
x
1
,
y
1
,
x
2
,
y
2
=
max
(
f
x
1
−
1
,
y
1
,
x
2
−
1
,
y
2
,
f
x
1
,
y
1
−
1
,
x
2
−
1
,
y
2
,
f
x
1
−
1
,
y
1
,
x
2
,
y
2
−
1
,
f
x
1
,
y
1
−
1
,
x
2
,
y
2
−
1
)
+
1
f_{x_1,y_1,x_2,y_2}=\max(f_{x_1-1,y_1,x_2-1,y_2},f_{x_1,y_1-1,x_2-1,y_2},f_{x_1-1,y_1,x_2,y_2-1},f_{x_1,y_1-1,x_2,y_2-1})+1
fx1,y1,x2,y2=max(fx1−1,y1,x2−1,y2,fx1,y1−1,x2−1,y2,fx1−1,y1,x2,y2−1,fx1,y1−1,x2,y2−1)+1,发现第四个状态可以通过其他三个算出来,所以空间和时间复杂度都是
n
3
n^3
n3,但对于重合状态需要特判,删掉即可。
T5:
似乎并不需要dp,能跳就跳,分别记录休息和走路,比较哪个大,特判忘向上取整哭了。
T6:
和T1差不多的区间dp,每行分别考虑即可,听说ull可以卡过去,虽然我写高精也过了。
T7:
最短路加个特判就过了,这输入格式。。。aoj似乎不审题面的啊。。。
T8:
经典,题目下面把做法都贴出来了,太感人了。
T9:
这种长相的式子一眼斜率优化,式子转移都推对了,队列最开始有个0点漏了,直接gg。
设
s
u
m
c
i
sumc_i
sumci表示
c
c
c数组的前缀和,设计状态
f
i
f_i
fi表示考虑到
i
i
i的最小费用,显然有式子
f
i
=
min
j
=
1
j
<
i
(
f
j
+
(
i
−
j
−
1
+
s
u
m
c
i
−
s
u
m
c
j
−
L
)
2
)
f_i=\min_{j=1}^{j<i}(f_j+(i-j-1+sumc_i-sumc_j-L)^2)
fi=minj=1j<i(fj+(i−j−1+sumci−sumcj−L)2),若令
s
u
m
i
=
s
u
m
c
i
+
i
sum_i=sumc_i+i
sumi=sumci+i,
l
=
L
+
1
l=L+1
l=L+1则
f
i
=
min
j
=
1
j
<
i
(
f
j
+
(
s
u
m
i
−
s
u
m
j
−
l
)
2
)
f_i=\min_{j=1}^{j<i}(f_j+(sum_i-sum_j-l)^2)
fi=minj=1j<i(fj+(sumi−sumj−l)2),
则当
j
>
k
j>k
j>k时,若
j
j
j比
k
k
k优,有
f
j
+
(
s
u
m
i
−
s
u
m
j
−
l
)
2
<
f
k
+
(
s
u
m
i
−
s
u
m
k
−
l
)
f_j+(sum_i-sum_j-l)^2<f_k+(sum_i-sum_k-l)
fj+(sumi−sumj−l)2<fk+(sumi−sumk−l),
移项相消得
f
j
−
f
k
<
s
u
m
k
2
−
s
u
m
j
2
+
2
(
s
u
m
i
+
l
)
(
s
u
m
j
−
s
u
m
k
)
f_j-f_k<sum_k^2-sum_j^2+2(sum_i+l)(sum_j-sum_k)
fj−fk<sumk2−sumj2+2(sumi+l)(sumj−sumk)
把
j
,
k
j,k
j,k项全部移到左边得
f
j
+
s
u
m
j
−
f
k
−
s
u
m
k
2
(
s
u
m
j
−
s
u
m
k
)
<
s
u
m
i
−
l
\frac{f_j+sum_j-f_k-sum_k}{2(sum_j-sum_k)}<sum_i-l
2(sumj−sumk)fj+sumj−fk−sumk<sumi−l
得到斜率式,因为本题斜率单调上升,所以维护下凸包即可。
贴个转移代码吧
h=t=0; //开头点是0啊啊啊
for(int i=1;i<=n;i++)
{
while(h<t&&kk(q[h+1],q[h])<=sum[i]-l) h++;
f[i]=f[q[h]]+(sum[i]-sum[q[h]]-l)*(sum[i]-sum[q[h]]-l);
while(h<t&&kk(i,q[t])<kk(q[t],q[t-1])) t--;
q[++t]=i;
}
T10:
经典,最长上升和最长公共的缝合,做法也差不多。
需要注意,定义
f
i
,
j
f_{i,j}
fi,j表示
a
a
a数组到
i
i
i,与
b
j
b_j
bj配对的最长公共上升子序列,也就是说
i
i
i是不严格相等的,而
j
j
j是严格相等的,可以得到转移式
f
i
,
j
=
{
f
i
−
1
,
j
a
i
≠
b
j
max
k
<
j
&
&
a
i
>
b
k
(
f
i
−
1
,
k
+
1
)
a
i
=
b
j
f_{i,j}=\begin{cases} f_{i-1,j} & a_i\ne b_j \\ \max_{k<j\And \And a_i>b_k}(f_{i-1,k}+1) & a_i=b_j \end{cases}
fi,j={fi−1,jmaxk<j&&ai>bk(fi−1,k+1)ai=bjai=bj
直接转移复杂度
O
(
n
3
)
O(n^3)
O(n3),但发现二式只需要一个前缀
max
\max
max就能转移了,记录一下优化至
O
(
n
2
)
O(n^2)
O(n2)。
结果我前缀都能求错,哈哈。
总结:都是经典例题,斜率优化虽然是个板子但还是有点难度,不错。