传送门

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. 这份门禁系统培训PPT也太全面了,门禁系统知识,看这一篇就够了
  2. 毕设开发总结-3D游戏框架及网络对战游戏的开发(1)
  3. PyTorch 1.0 中文官方教程:可选:数据并行处理
  4. MySQL 用gourp by分组后取某一字段最大值
  5. 51nod 1286 三段子串(树状数组+拓展kmp)
  6. 2. PSR-2 --- 代码风格指南
  7. java中class文件反编译_java中的.class文件反编译
  8. 抖音sdk,抖音开发api接口
  9. PHP叫号系统,排队叫号系统
  10. 无线攻击入侵工具清单
  11. 俄罗斯方块是java_俄罗斯方块(java版)
  12. 抖音、美团等大厂千万级用户的Android客户端架构演进之路—
  13. linux oracle 查看版本
  14. 网络资源共享实验报告
  15. 没有kindle 但要接收mox moe的邮箱推送
  16. Install OpenERP in TurnkeyLinux Core
  17. 汇川H3U标准程序,程序有本体脉冲控制的三轴定位,有总线控制的汇川伺服定位
  18. 高压空气压缩机气体压缩的目的
  19. 软骨鱼颠覆传统软件SaaS化改造之路:30分钟快速SaaS化
  20. Optix SDK sample编译

热门文章

  1. exp/imp迁移表
  2. 一个资源管理系统的设计--基于cgroup机制
  3. 对anagrams分组 Group Anagrams
  4. Java初学者需掌握的30个概念
  5. java: cannot execute binary file问题的解决
  6. Gnome Tweak Tool 3.0.5发布
  7. kingdee kis
  8. Sharepoint2010 表单认证常见问题
  9. PostgreSql Lock锁
  10. Python[8] :paramiko模块多进程批量管理主机