传送门

N个数,为1或2.由一次操作,对一段区间进行反转,然后求最长不下降子序列长度

emmm想的是如果反转区间可以使答案较原本序列更大,那么区间内对答案的贡献必然是一个1与2组成的序列。总共反转的区间有n^2个,那么如果我们对于每个反转序列,能够O(1)得求出贡献即可得到答案,因为区间前1的数目与区间后2的数目只需维护前缀和即可O(1)求得。

我们用dp[j][i]代表从区间[j, i]能得到的同时包含1 2的不降序列的长度.

A[i]==1时,dp[j][i] = dp[j + 1][i];

A[i]==2,  dp[j][i] = 1 + max([j+1,i]1的数目,dp[j+1][i]);

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;const int maxn = 2e3 + 10;
int N;
int A[maxn];
int cnt[maxn][2];
int dp[maxn][maxn];
int ans[maxn];int main() {scanf("%d", &N);for (int i = 1; i <= N; i++) scanf("%d", &A[i]);memset(cnt, 0, sizeof(cnt));for (int i = 1; i <= N; i++) {if (A[i] == 1) {cnt[i][0] = cnt[i - 1][0] + 1;cnt[i][1] = cnt[i - 1][1];} else {cnt[i][0] = cnt[i - 1][0];cnt[i][1] = cnt[i - 1][1] + 1;}}for (int i = 1; i <= N; i++) {ans[i] = 1;for (int j = 1; j < i; j++) {if (A[j] <= A[i]) {ans[i] = max(ans[i], ans[j] + 1);}}}memset(dp, 0, sizeof(dp));int res = ans[N];for (int i = N; i >= 1; i--) {for (int j = i - 1; j >= 1; j--) {if (A[j] == 1) {dp[j][i] = dp[j + 1][i];} else {int t = cnt[i][0] - cnt[j][0];dp[j][i] = max(t, dp[j + 1][i]) + 1;}}}for (int i = 1; i <= N; i++) {for (int j = i + 1; j <= N; j++) {int t1 = cnt[i - 1][0];int t2 = cnt[N][1] - cnt[j][1];int tt = t1 + t2 + dp[i][j];if (tt > res) {res = tt;}}}printf("%d\n", res);return 0;
}

转载于:https://www.cnblogs.com/xFANx/p/8449089.html

Codeforces-462C. A Twisty Movement相关推荐

  1. Codeforces 934C - A Twisty Movement

    934C - A Twisty Movement 思路:dp 很容易想到要预处理出1的前缀和pre[i]和2的后缀和suf[i] 然后枚举区间,对于每个区间如果能求出最长递减序列的长度,那么就能更新答 ...

  2. CodeForces - 933A A Twisty Movement(dp)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列,只由 1 和 2 组成,现在允许反转一段区间,问反转后的不下降子序列最长是多少 题目分析:因为 n 只有 2000,所以考虑n2n^2n2去枚 ...

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

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

  4. [2.7]【CF933A】A Twisty Movement【CF926B】Add Points【CF917A】The Monster【CF919E】Congruence Equation

    文章目录 T1:A Twisty Movement 题目 题解 code T2:Add Points 题目 题解 code T3:The Monster 题目 题解 code T4:Congruenc ...

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

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

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

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

  7. Codeforces 题目合集+分类+代码 【Updating...】【361 in total】

    961A - Tetris                                                模拟                                      ...

  8. 人像构图(特写/半身/七分/全身)

    特写(头部<=20cm,胸部10cm上下) 半身 七分 全身 查看全文 http://www.taodudu.cc/news/show-5828743.html 相关文章: 服务器 网卡芯片,网 ...

  9. android 生物识别_如何在android中设置生物特征认证

    android 生物识别 本文的重点 (The Takeaway From This Article) Biometric authentication is an extension of fing ...

最新文章

  1. 高效的找出两个List中的不同元素
  2. Xshell连接Centos完整版(动态ip)
  3. 三 mybatis typeAlias(别名)使用和resultMap使用
  4. C# 发送邮件的记录(qq,126,Gmail)
  5. revit建筑样板_黄石建筑工地工艺样板怎么做可按需定制
  6. Apache Curator之分布式锁原理(二)
  7. [转载] Java static关键字与static{}语句块
  8. OJ1031: 判断点在第几象限
  9. 登录与注册 艺术与业务 的结合
  10. (4)计数器systemverilog与VHDL编码
  11. ASP.net 判断上传文件类型的三种方法
  12. 前端开发学习之——dom ready和window onload的区别
  13. linux 中软件安装的三种方法
  14. SwiftyJSON
  15. 3dmax:3dmax的软件面板简介、软件配置优化、设计流程、设计经验、六种建模方法
  16. mysql间隙锁 打开_MySQL数据库间隙锁
  17. 计算机无法识别佳能70d相机,佳能相机常见的错误代码和解决方案-万兴恢复专家...
  18. 计算机核心期刊新排名(八大学报)
  19. teamspeak3自建服务器,宝塔面板安装teamspeak3 – 搭建自己的语音聊天服务器
  20. 一文读懂什么是卡尔曼滤波

热门文章

  1. CSS3: box-sizing 属性的简单认识
  2. 淘宝Tprofiler工具实现分析
  3. 记录一次通过抓包解决Zabbix no active checks on server
  4. dirty_ratio与dirty_background_ratio参数区别--系统优化必选
  5. UrlRewriter URL重写
  6. Codeforces Round #375 (Div. 2) F. st-Spanning Tree 生成树
  7. 开源项目ActiveAndroid简述增、删、改、查
  8. PHP Object对象转换为Array数组
  9. MyEclipse卡死解决方法
  10. Android Activity界面切换添加动画特效 (转载修改)