Codeforces-462C. A Twisty Movement
传送门
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相关推荐
- Codeforces 934C - A Twisty Movement
934C - A Twisty Movement 思路:dp 很容易想到要预处理出1的前缀和pre[i]和2的后缀和suf[i] 然后枚举区间,对于每个区间如果能求出最长递减序列的长度,那么就能更新答 ...
- CodeForces - 933A A Twisty Movement(dp)
题目链接:点击查看 题目大意:给出一个长度为 n 的数列,只由 1 和 2 组成,现在允许反转一段区间,问反转后的不下降子序列最长是多少 题目分析:因为 n 只有 2000,所以考虑n2n^2n2去枚 ...
- Codeforces Round #462 (Div. 2) C. A Twisty Movement dp + 思维转换
传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的只包含1,21,21,2的序列aaa,你可以至多翻转一段区间,求翻转之后最长非递减子序列是多长. 思路: 考虑如果翻转的话,翻转的子区间 ...
- [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 ...
- Codeforces Round #462 (Div. 1) A Twisty Movement -12序列的LIS
题目链接:https://codeforces.com/problemset/problem/933/A 题目大意: 在一个只包含 1,2 的序列中,翻转其中任意一个区间,求此时最大的 LIS . 一 ...
- Codeforces Round #462 (Div. 2), problem: (C) A Twisty Movement (求可以转一次区间的不递增子序列元素只有1,2)...
题目意思: 给长度为n(n<=2000)的数字串,数字只能为1或者2,可以将其中一段区间[l,r]翻转,求翻转后的最长非递减子序列长度. 题解:求出1的前缀和,2的后缀和,以及区间[i,j]的最 ...
- Codeforces 题目合集+分类+代码 【Updating...】【361 in total】
961A - Tetris 模拟 ...
- 人像构图(特写/半身/七分/全身)
特写(头部<=20cm,胸部10cm上下) 半身 七分 全身 查看全文 http://www.taodudu.cc/news/show-5828743.html 相关文章: 服务器 网卡芯片,网 ...
- android 生物识别_如何在android中设置生物特征认证
android 生物识别 本文的重点 (The Takeaway From This Article) Biometric authentication is an extension of fing ...
最新文章
- 这份门禁系统培训PPT也太全面了,门禁系统知识,看这一篇就够了
- 毕设开发总结-3D游戏框架及网络对战游戏的开发(1)
- PyTorch 1.0 中文官方教程:可选:数据并行处理
- MySQL 用gourp by分组后取某一字段最大值
- 51nod 1286 三段子串(树状数组+拓展kmp)
- 2. PSR-2 --- 代码风格指南
- java中class文件反编译_java中的.class文件反编译
- 抖音sdk,抖音开发api接口
- PHP叫号系统,排队叫号系统
- 无线攻击入侵工具清单
- 俄罗斯方块是java_俄罗斯方块(java版)
- 抖音、美团等大厂千万级用户的Android客户端架构演进之路—
- linux oracle 查看版本
- 网络资源共享实验报告
- 没有kindle 但要接收mox moe的邮箱推送
- Install OpenERP in TurnkeyLinux Core
- 汇川H3U标准程序,程序有本体脉冲控制的三轴定位,有总线控制的汇川伺服定位
- 高压空气压缩机气体压缩的目的
- 软骨鱼颠覆传统软件SaaS化改造之路:30分钟快速SaaS化
- Optix SDK sample编译