题目链接:http://codeforces.com/contest/934/problem/C
因为最后要找的是一段单调非减区间,所以最后形成的序列一定是11...12....22。中间有一个从1到2的断点。
现在要找一个区间反转,如果反转之后形成的序列的断点不在这个区间内,那么这次反转就没有任何意义,所以在dp区间里,断点必须包含在其中。
开一个三维数组dp[2010][2010][2];
dp[i][j][0]代表【i,j】区间中数字的状态,1代表全是1,2代表全是2,3代表1和2都有。
dp[i][j][1]代表【i,j】区间中最长非递增子序列的最大长度。
再开三个数组a,b,c,a[i]代表在i之前有多少个1,b[i]表示在i之后有多少个2,c[i]表示在i之前有多少个2(都不包括i位置,其中c当做前缀数组使用)
在dp的过程中考量dp[i][j][1]+a[i]+b[j]的大小,取最大值就是最后的答案。
#include #include #include #include #include