题目意思: 给长度为n(n<=2000)的数字串,数字只能为1或者2,可以将其中一段区间[l,r]翻转,求翻转后的最长非递减子序列长度。

题解:求出1的前缀和,2的后缀和,以及区间[i,j]的最长不递增子序列。

f[i][j][0]表示区间i-j以1结尾的最长不递增子序列;

f[i][j][1]表示区间i-j以2结尾的最长不递增子序列,显然是区间i-j 2的个数;

所以转移方程为:

f[i][j][1] = f[i][j-1][1] + (a[j]==2);
   f[i][j][0] = max(f[i][j-1][0], f[i][j-1][1]) + (a[j]==1);(1<=i<=n,i<=j<=n)

//#include"bits/stdc++.h"
#include <sstream>
#include <iomanip>
#include"cstdio"
#include"map"
#include"set"
#include"cmath"
#include"queue"
#include"vector"
#include"string"
#include"cstring"
#include"time.h"
#include"iostream"
#include"stdlib.h"
#include"algorithm"
#define db double
#define ll long long
#define vec vector<ll>
#define mt  vector<vec>
#define ci(x) scanf("%d",&x)
#define cd(x) scanf("%lf",&x)
#define cl(x) scanf("%lld",&x)
#define pi(x) printf("%d\n",x)
#define pd(x) printf("%f\n",x)
#define pl(x) printf("%lld\n",x)
//#define rep(i, x, y) for(int i=x;i<=y;i++)
#define rep(i,n) for(int i=0;i<n;i++)
const int N   = 2e3 + 5;
const int mod = 1e9 + 7;
const int MOD = mod - 1;
const int inf = 0x3f3f3f3f;
const db  PI  = acos(-1.0);
const db  eps = 1e-10;
using namespace std;
int a[N];
int l[N],r[N];
int f[N][N][2];
int main()
{int n;ci(n);for(int i=1;i<=n;i++) ci(a[i]),l[i]=l[i-1]+(a[i]==1);for(int i=n;i>=0;i--) r[i]=r[i+1]+(a[i]==2);int ma=-1;for(int i=1;i<=n;i++){for(int j=i;j<=n;j++){f[i][j][1]=f[i][j-1][1]+(a[j]==2);f[i][j][0]=max(f[i][j-1][0],f[i][j-1][1])+(a[j]==1);ma=max(ma,f[i][j][1]+l[i-1]+r[j+1]);ma=max(ma,f[i][j][0]+l[i-1]+r[j+1]);}}pi(ma);return 0;
}

View Code

超强O(n) 解法

翻转后的合法子序列翻转前一定是 一坨1 + 一坨2 + 一坨1 + 一坨2形式,坨可以为空,于是可以用4个变量分别维护前1坨,前2坨,前3坨,前4坨的最大值,更新时每个变量也只用上一轮最多两个变量更新,比如当前元素为2,那么前两坨的最大值ma2 = max(ma1, ma2) + 1,ma4 = max(ma3, ma4) + 1。因为将2接到ma1或ma2后的序列都是合法的ma2形式。代码十分简短。时间复杂度O(n),空间复杂度O(1)。

#include <iostream>
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <set>
#include <map>
#include <list>
#include <iomanip>
#include <cctype>
#include <cassert>
#include <bitset>
#include <ctime>using namespace std;#define pau system("pause")
#define ll long long
#define pii pair<int, int>
#define pb push_back
#define mp make_pair
#define clr(a, x) memset(a, x, sizeof(a))const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double EPS = 1e-9;int ma1, ma2, ma3, ma4, x, n;
int main() {scanf("%d", &n);for (int i = 1; i <= n; ++i) {scanf("%d", &x);if (1 == x) {++ma1;ma3 = max(ma3, ma2) + 1;} else {ma2 = max(ma1, ma2) + 1;ma4 = max(ma4, ma3) + 1;}}printf("%d\n", max(ma3, ma4));return 0;
}

View Code

转载于:https://www.cnblogs.com/shuaihui520/p/10345628.html

Codeforces Round #462 (Div. 2), problem: (C) A Twisty Movement (求可以转一次区间的不递增子序列元素只有1,2)...相关推荐

  1. Codeforces Round #462 (Div. 2) C. A Twisty Movement dp + 思维转换

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的只包含1,21,21,2的序列aaa,你可以至多翻转一段区间,求翻转之后最长非递减子序列是多长. 思路: 考虑如果翻转的话,翻转的子区间 ...

  2. Codeforces Round #462 (Div. 2)题解

    Codeforces Round #462 (Div. 2) B题--我固执的认为1e18是18位数,导致被hack,花了20分钟才检查出这个错误,很僵硬 Codeforces 934C 题意 给定一 ...

  3. Codeforces Round #462 (Div. 2): A. A Compatible Pair

    题目链接:http://codeforces.com/contest/934/problem/A 题意: 给出两个数组,第一个人要从第一个数组中删掉任意一个数,第二个人要从两个数组中各挑出一个数相乘 ...

  4. Codeforces Round #243 (Div. 2) Problem B - Sereja and Mirroring 解读

    http://codeforces.com/contest/426/problem/B 对称标题的意思大概是.应当指出的,当线数为奇数时,答案是线路本身的数 #include<iostream& ...

  5. Codeforces Round #439 (Div. 2) Problem C (Codeforces 869C) - 组合数学

    - This is not playing but duty as allies of justice, Nii-chan! - Not allies but justice itself, Onii ...

  6. Codeforces Round #770 (Div. 2) Problem B.Fortune Telling

    题意: 给定两个数,Alice的数x, Bob的数 x + 3,和一个长度为n的数组a,x和x + 3都要和a的每一个数执行 "加法" 或 "异或" 两个操作的 ...

  7. Codeforces Round #462 (Div. 1) A Twisty Movement -12序列的LIS

    题目链接:https://codeforces.com/problemset/problem/933/A 题目大意: 在一个只包含 1,2 的序列中,翻转其中任意一个区间,求此时最大的 LIS . 一 ...

  8. Codeforces Round #372 (Div. 2), problem: (B) Complete the Word

    水题,每次截取长度为26的字符串,然后直接进行修改就可以 然而本弱渣昨天wa看很久 include<bits/stdc++.h> using namespace std; int n,c; ...

  9. Codeforces Round #368 (Div. 2) problem: (C) Pythagorean Triples

    本题就一个公式 n^2+((n^2-1)/2)^2=((n^2+1)/2)^2 0.当n==1或n==2时,不存在结果. 1.当n为奇数时此公式求得的数还是整数,成立 2.当n为偶数时分两种情况: ( ...

最新文章

  1. 开发人员MySQL调优-实战篇2-让SQL使用索引详解
  2. HDU Problem 1272 小希的迷宫 【并查集】
  3. html5做旋转太极图,HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)...
  4. Java爬虫搜索原理实现
  5. vue-cli安装教程
  6. 解决mac升级后,出现的 xcrun: error: invalid active developer path, missing xcrun 错误
  7. 解决:vue 用 axios 发送请求,每次都会发送两次请求
  8. For in 详解
  9. 深度学习的实用层面 —— 1.11 神经网络的权重初始化
  10. Python 带你来一次说走就走的环球旅行
  11. Net设计模式实例之桥接模式( Bridge Pattern)(1)
  12. Linux下Gogs二进制安装配置
  13. 什么是ROE、ROA和ROS?衡量企业盈利能力的比率有哪些?
  14. PyCharm取消波浪线、下划线和中划线
  15. python爬取周杰伦歌词_Python 爬取周杰伦 instagram
  16. 基于MPLS的VPLS
  17. 基于等级保护梳理服务器安全合规基线
  18. java excel 导入 加校验_【JavaWeb】导入Excel并进行校验
  19. 动态规划题目——背包
  20. Python验证“哥德巴赫猜想”

热门文章

  1. android群英传 自定义滑动view,Android群英传学习之路-View的滑动
  2. java class 字符串_java基础知识四 math类 字符 字符串 控制台输入输出 StringBuilder与StringBuffer...
  3. Python3——简单的UDP实例
  4. 每日一题(36)—— 什么是预编译 , 何时需要预编译?
  5. ajax 五种状态,ajax的五种状态
  6. 笔记本AutoCAD启动时闪退怎么办_戴尔笔记本电脑开不了机如何解决【解决方法】...
  7. LeetCode 1742. 盒子中小球的最大数量
  8. LeetCode 775. 全局倒置与局部倒置(归并排序/二分查找/一次遍历)
  9. PAM+4+matlab,基于PAM4调制的400G光模块
  10. Android全局窗口模糊,javascript – 窗口焦点和模糊事件在Android浏览器上无法正常工作...