acwing 3549. 最长非递减子序列
链接:https://www.acwing.com/problem/content/3552/
题目描述
给定一个由1和2组成的长为n的数列,让你选定一个区间翻转(1变2,2变1),使得翻转完的数列的最长非递减子序列最长
解题思路
(首先看清是子序列而不是子串,二者有很大的区别)
对于一个满足题意的序列我们总共只有4种情况:
s1:111111
s2:111222
s3:112211
s4:122122
状态数少,所以我们的第一反应应该就是dp
对于s1,它只可能由上一个s1+1变过来,所以s1=s1+1
对于s2,它可能由上一个s2+1变过来,也有可能由s1+1变过来,所以s2=max(s1+1,s2+1)
对于s3,它可能由上一个s3+1变过来,也有可能由s2+1变过来,所以s3=max(s2+1,s3+1)
对于s4,它可能由上一个s4+1变过来,也有可能由s3+1变过来,所以s4=max(s3+1,s4+1)
最后ans=max(s1,s2,s3,s4)
结束,上代码
代码
#include<iostream>
#include<cstdio>
#include<cstring>