Codeforces Round #462 (Div. 2), problem: (C) A Twisty Movement (求可以转一次区间的不递增子序列元素只有1,2)...
题目意思: 给长度为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)...相关推荐
- Codeforces Round #462 (Div. 2) C. A Twisty Movement dp + 思维转换
传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的只包含1,21,21,2的序列aaa,你可以至多翻转一段区间,求翻转之后最长非递减子序列是多长. 思路: 考虑如果翻转的话,翻转的子区间 ...
- Codeforces Round #462 (Div. 2)题解
Codeforces Round #462 (Div. 2) B题--我固执的认为1e18是18位数,导致被hack,花了20分钟才检查出这个错误,很僵硬 Codeforces 934C 题意 给定一 ...
- Codeforces Round #462 (Div. 2): A. A Compatible Pair
题目链接:http://codeforces.com/contest/934/problem/A 题意: 给出两个数组,第一个人要从第一个数组中删掉任意一个数,第二个人要从两个数组中各挑出一个数相乘 ...
- Codeforces Round #243 (Div. 2) Problem B - Sereja and Mirroring 解读
http://codeforces.com/contest/426/problem/B 对称标题的意思大概是.应当指出的,当线数为奇数时,答案是线路本身的数 #include<iostream& ...
- 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 ...
- Codeforces Round #770 (Div. 2) Problem B.Fortune Telling
题意: 给定两个数,Alice的数x, Bob的数 x + 3,和一个长度为n的数组a,x和x + 3都要和a的每一个数执行 "加法" 或 "异或" 两个操作的 ...
- Codeforces Round #462 (Div. 1) A Twisty Movement -12序列的LIS
题目链接:https://codeforces.com/problemset/problem/933/A 题目大意: 在一个只包含 1,2 的序列中,翻转其中任意一个区间,求此时最大的 LIS . 一 ...
- Codeforces Round #372 (Div. 2), problem: (B) Complete the Word
水题,每次截取长度为26的字符串,然后直接进行修改就可以 然而本弱渣昨天wa看很久 include<bits/stdc++.h> using namespace std; int n,c; ...
- 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为偶数时分两种情况: ( ...
最新文章
- 开发人员MySQL调优-实战篇2-让SQL使用索引详解
- HDU Problem 1272 小希的迷宫 【并查集】
- html5做旋转太极图,HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)...
- Java爬虫搜索原理实现
- vue-cli安装教程
- 解决mac升级后,出现的 xcrun: error: invalid active developer path, missing xcrun 错误
- 解决:vue 用 axios 发送请求,每次都会发送两次请求
- For in 详解
- 深度学习的实用层面 —— 1.11 神经网络的权重初始化
- Python 带你来一次说走就走的环球旅行
- Net设计模式实例之桥接模式( Bridge Pattern)(1)
- Linux下Gogs二进制安装配置
- 什么是ROE、ROA和ROS?衡量企业盈利能力的比率有哪些?
- PyCharm取消波浪线、下划线和中划线
- python爬取周杰伦歌词_Python 爬取周杰伦 instagram
- 基于MPLS的VPLS
- 基于等级保护梳理服务器安全合规基线
- java excel 导入 加校验_【JavaWeb】导入Excel并进行校验
- 动态规划题目——背包
- Python验证“哥德巴赫猜想”
热门文章
- android群英传 自定义滑动view,Android群英传学习之路-View的滑动
- java class 字符串_java基础知识四 math类 字符 字符串 控制台输入输出 StringBuilder与StringBuffer...
- Python3——简单的UDP实例
- 每日一题(36)—— 什么是预编译 , 何时需要预编译?
- ajax 五种状态,ajax的五种状态
- 笔记本AutoCAD启动时闪退怎么办_戴尔笔记本电脑开不了机如何解决【解决方法】...
- LeetCode 1742. 盒子中小球的最大数量
- LeetCode 775. 全局倒置与局部倒置(归并排序/二分查找/一次遍历)
- PAM+4+matlab,基于PAM4调制的400G光模块
- Android全局窗口模糊,javascript – 窗口焦点和模糊事件在Android浏览器上无法正常工作...