T1
。。简单题,只是考试时想出来了写错了考后10min过了。。
确定出正的和负的的绝对值最大处即可,可以dfs求。
T2
50pts
区间dp,复杂度为\(O(n^3)\)。
70pts
考虑dp,f[i][j]表示在前i个数中还有j个左括号未匹配时的最大值,分正负考虑,然后考虑加右括号,左括号,不加时的转移。
100pts
考虑到括号最多嵌套2层,缩小上面做法的第二维就行了。
转移:
for(int i=2;i<=n;i++)
if(op[i]=='-'){
for(int j=1;j<=4;j++){
f[i][j]=max(f[i][j],f[i-1][j-1]+(((j-1)&1)?a[i]:(-a[i])));
}
for(int j=0;j<=4;j++){
f[i][j]=max(f[i][j],f[i-1][j]+((j&1)?a[i]:(-a[i])));
}
for(int j=0;j<4;j++){
f[i][j]=max(f[i][j],f[i-1][j+1]+(((j+1)&1)?a[i]:(-a[i])));
}
}
else {
for(int j=0;j<=4;j++){
f[i][j]=max(f[i][j],f[i-1][j]+((j&1)?(-a[i]):a[i]));
}
for(int j=0;j<4;j++){
f[i][j]=max(f[i][j],f[i-1][j+1]+(((j+1)&1)?(-a[i]):a[i]));
}
}
T3
45pts
建图跑最短路,复杂度:\(O(w^2)\)。
100pts
引理1
必有一条最短路线,仅在矩形的边上转弯。
引理2
必有一条最短的路线,它的x是递增的。
引理可感性理解。
于是可以考虑dp。
状态即为在每个矩形四角时走的最短路程,然后实际上只用考虑每个矩形左边的边就行了。
按横坐标排序,对于一条线段l,r,只有纵坐标在l,r内的点的dp值可以更新线段的断电,所以可以用set维护。